2016-02-28 38 views
1

我想下面的代碼,以產生像的代碼如下所示的結構。我沒有從代碼中得到它。動態3D可變列字符數組操作用C

我想要代碼創建一個3D動態數組,其中包含如下所示的數據,以便當我要打印特定的字符串(如printf("%s\n",szData[2][3]);)時,我會得到"string4"。另外,我想從特定位置獲取特定字符,例如putchar(szData[0][3][2]我得到'r'

而是下面的代碼,儘管指定位置打印出最後保存的數據。例如printf("%s",szData[0][0]);應該已經"string1"它打印出"string2"這是szData[2][1]數據。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    char***szData; 
    char temp[500]; 
    int i,j,k,x,n,m,index; 

    printf("Rows:"); 
    scanf("%d",&n); 

    szData=(char***)malloc(n*sizeof(char)); 

    for(i=0;i<n;i++){ 
     printf("Col: "); 
     scanf("%d",&m); 
     szData[i]=(char**)malloc(m*sizeof(char)); 
     for(j=0;j<m;j++){ 

      printf("string[%d][%d]=",i,j); 
      scanf("%s",temp); 
      szData[i][j]=(char*)malloc(25*sizeof(char)); 
      szData[i][j]=temp; 

     } 
    } 


      printf("memmory[%d][%d]=%s\n",0,2,szData[0][2]);//Printing string from specific location 


    return 0; 
} 

Expected structure: 

    +----------+----------+----------+----------+ 
    | 0  |  1 |  2 | 3  | 
+----+----------+----------+----------+----------+ 
| 0 | string1 | string2 | string3 |string4 | 
+----+----------+----------+----------+--------- + 
    +----------+----------+ 
    | 0  |  1 | 
+----+----------+----------+ 
| 0 | string1 | string2 | 
+----+----------+----------+ 
    +----------+ 
    | 0  |  
+----+----------+ 
| 1 | string1 | 
+----+----------+ 
    +----------+----------+----------+----------+ 
    | 0  |  1 |  2 | 3  | 
+----+----------+----------+----------+----------+ 
| 2 | string1 | string2 | string3 |string4 | 
+----+----------+----------+----------+--------- + 
    +----------+----------+ 
    | 0  |  1 |  
+----+----------+----------+ 
| 2 | string1 | string2 | 
+----+----------+----------+ 
    +----------+----------+----------+----------+ 
    | 0  |  1 |  2 | 3  | 
+----+----------+----------+----------+----------+ 
| 2 | string1 | string2 | string3 |string4 | 
+----+----------+----------+----------+--------- + 
    +----------+----------+ 
    | 0  |  1 |  
+----+----------+----------+ 
| 2 | string1 | string2 | 
+----+----------+----------+ 

代碼波紋管工作正常。爲什麼不是以上?

#include <stdio,h> 
#include <stdlib.h> 
#include <string.h> 
int main() 
{ 
    char***szData; 
    char temp[25]; 
    szData= (char ***)malloc(4 * sizeof(char **)) ; 
    szData[0]=(char**)malloc(2*sizeof(char)); 
    szData[0][0]=(char*)malloc(25*sizeof(char)); 
    szData[0][0]="Henry\0"; 
    szData[0][1]=(char*)malloc(25*sizeof(char)); 
    szData[0][1]="Korir\0"; 
    szData[1]=(char**)malloc(sizeof(char)); 
    szData[1][0]=(char*)malloc(25*sizeof(char)); 
    szData[1][0]="BSc.\0"; 
    szData[2]=(char**)malloc(3*sizeof(char)); 
    szData[2][0]=(char*)malloc(25*sizeof(char)); 
    szData[2][0]="Software Engineering\0"; 
    szData[2][1]=(char*)malloc(25*sizeof(char)); 
    szData[2][1]="Kenyatta\0 "; 
    szData[2][2]=(char*)malloc(25*sizeof(char)); 
    szData[2][2]="University\0"; 
    szData[3]=(char**)malloc(sizeof(char)); 
    szData[3][0]=(char*)malloc(25*sizeof(char)); 
    szData[3][0]="From Kipsaiya, Kenya\0"; 

    printf("szData[%d][%d]=%c size=%d\n",0,1,szData[2][0][0],sizeof(szData[0][1])); 
    strcpy(temp,szData[2][0]); 
    putchar(szData[0][0][0]); 
    printf("temp=%s size=%d\n",temp,sizeof(szData[2][0])); 
return 0; 
} 
+0

[可能的重複](http://stackoverflow.com/questions/35542391/segmentation-fault-but-unable-to-reason-how-memory-allocation-looks-fine-to-me/35542617#35542617) (免責聲明:無恥的插件)。 –

+0

你好。感謝你的貢獻。代碼在執行過程中被壓制。我很樂意看到您提供的代碼有所改進。 – K1b1w077

回答

1

這些分配都是錯誤的

szData=(char***)malloc(n*sizeof(char)); 
           ^^^^^ 
szData[i]=(char**)malloc(m*sizeof(char)); 
            ^^^^^ 

應該有

szData=(char***)malloc(n*sizeof(char **)); 
           ^^^^^^^ 
szData[i]=(char**)malloc(m*sizeof(char *)); 
            ^^^^^^^ 

,反而導致內存泄漏,你必須使用標準功能strcpy分配

szData[i][j]=temp; 

strcpy(szData[i][j], temp); 

另外,作爲列的每行中的數量是不同的,那麼你應該以某種方式保存有關列在一排數的信息。

一個辦法是分配了一個多列,最後一列設置爲NULL

這裏是一個示範項目

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    char ***szData; 
    unsigned int n, m; 
    unsigned int i, j; 

    printf("Rows: "); 
    scanf("%u", &n); 

    szData = (char***)malloc(n * sizeof(char **)); 

    for (i = 0; i < n; i++) 
    { 
     printf("Col: "); 
     scanf("%u", &m); 

     szData[i] = (char **)calloc((m + 1), sizeof(char *)); 
     for (j = 0; j < m; j++) 
     { 
      char temp[25]; 
      printf("string[%u][%u] = ", i, j); 
      scanf("%24s", temp); 
      szData[i][j] = (char *)malloc(strlen(temp) + 1); 
      strcpy(szData[i][j], temp); 
     } 
    } 

    printf("\n"); 

    for (i = 0; i < n; i++) 
    { 
     for (j = 0; szData[i][j] != NULL; j++) printf("%10s", szData[i][j]); 
     printf("\n"); 
    }   

    for (i = 0; i < n; i++) 
    { 
     for (j = 0; szData[i][j] != NULL; j++) free(szData[i][j]);; 
     free(szData[i]); 
    } 

    free(szData);    

    return 0; 
} 

它的輸出可能看起來像

Rows: 7 
Col: 4 
string[0][0] = string1 
string[0][1] = string2 
string[0][2] = string3 
string[0][3] = string4 
Col: 2 
string[1][0] = string1 
string[1][1] = string2 
Col: 1 
string[2][0] = string1 
Col: 4 
string[3][0] = string1 
string[3][1] = string2 
string[3][2] = string3 
string[3][3] = string4 
Col: 2 
string[4][0] = string1 
string[4][1] = string2 
Col: 4 
string[5][0] = string1 
string[5][1] = string2 
string[5][2] = string3 
string[5][3] = string4 
Col: 2 
string[6][0] = string1 
string[6][1] = string2 

    string1 string2 string3 string4 
    string1 string2 
    string1 
    string1 string2 string3 string4 
    string1 string2 
    string1 string2 string3 string4 
    string1 string2 

編輯:您更新,然後你的問題後,像這樣的

szData[0][0]=(char*)malloc(25*sizeof(char)); 
szData[0][0]="Henry\0"; 

代碼也有錯。

至少有一個內存泄漏,因爲最初szData[0][0]被分配了內存的地址,然後在下一個語句中被重新分配。

此外,不需要編寫像"Henry\0"這樣的字符串文字,因爲字符串文字"Henry"已經具有終止零。

+0

它工作正常。感謝您的解決方案 – K1b1w077

+0

@ K1b1w077根本沒有。我們初學者應該互相幫助。:) –

+0

太好了!現在我知道更好。 – K1b1w077

1

szData[i][j]=temp;之後szData[i][j]=(char*)malloc(25*sizeof(char));之後導致內存泄漏。

分配足夠的內存和拷貝讀取的字符串。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    char***szData; 
    char temp[500]; 
    int i,j,k,x,n,m,index; 

    printf("Rows:"); 
    scanf("%d",&n); 

    szData=malloc(n*sizeof(char**)); 

    for(i=0;i<n;i++){ 
     printf("Col: "); 
     scanf("%d",&m); 
     szData[i]=malloc(m*sizeof(char*)); 
     for(j=0;j<m;j++){ 

      printf("string[%d][%d]=",i,j); 
      scanf("%499s",temp); 
      szData[i][j]=malloc((strlen(temp)+1)*sizeof(char)); 
      strcpy(szData[i][j],temp); 

     } 
    } 


    printf("memmory[%d][%d]=%s\n",0,2,szData[0][2]);//Printing string from specific location 

    return 0; 
} 

注意,他們說you shouldn't cast the result of malloc() in C

+0

你好。感謝你的貢獻。代碼在執行過程中被壓制。我很樂意看到您提供的代碼有所改進。 – K1b1w077

+0

它沒有在[我的測試](http://melpon.org/wandbox/permlink/E0719fNj329QNe0Y)中崩潰。你的意見是什麼? – MikeCAT

+0

我使用了像名稱一樣的隨機字符串。更重要的是,我不得不在我的機器上編譯'malloc'來編譯它。 – K1b1w077