2013-11-03 28 views
0

我得到分割故障時,我通過這個2-d指針數組段故障〜2-d指針數組循環

聲明循環:

char **addr; 

addr=malloc((y)*sizeof(char)); //y is 3 
for(i=0;i<y;i++) 
{ 
     *(addr+i)=malloc(x*sizeof(char)); //x is 100 
} 

獨立訪問的工作原理:

*(*(addr+2)+0)='a'; 
printf("%c\n",*(*(addr+2)+0)); 

循環返回addr [2] [0]處的分段故障,而不管y和x是什麼

for(j=0;j<x;j++) 
{ 
     for(i=0;i<y;i++) 
     { 
       printf("%d %d\n",j,i); 
       *(*(addr+j)+i)='a'; 
     } 
} 

回答

1
addr=malloc((y)*sizeof(char)); 

必須

addr = malloc(y * sizeof(char *)); 
1

更換嘗​​試分配內存時使用X *x = malloc(sizeof *x)成語:

addr = malloc(y * sizeof *addr); 

所以sizeof結果實際上指的是你的數據的類型指向:

sizeof *addr == sizeof(char *) 
+0

+1一般用來做這兩種方法的,,我比較喜歡這一個僅僅是因爲它對你的指針所處的任何間接級別都是通用的。這條線對於單人,三人,無論如何都是一樣的。 – WhozCraig

0

以前的答案很好。這只是您可能考慮的一種選擇。這是一個方式做你在做什麼,這也將有助於正確地釋放內存(這有時是多指針數組痛)

定義功能做的工作:

char ** allocMemory(char ** a, int numStrings, int maxStrLen) 
{ 
    int i; 
    a = calloc(sizeof(char*)*(numStrings+1), sizeof(char*)); 
    for(i=0;i<numStrings; i++) 
    { 
     a[i] = calloc(sizeof(char)*maxStrLen+ 1, sizeof(char)); 
    } 
    return a; 
} 

void freeMemory(char ** a, int numStrings) 
{ 
    int i; 
    for(i=0;i<numStrings; i++) 
     if(a[i]) free(a[i]); 
    free(a); 
} 

然後,您可以簡單地使用您爲任意數量的字符串創建的參數調用這些函數,並使用最大字符串長度,然後使用預先配置的函數釋放它們。

所以,你的代碼應該是這樣的:

char **addr; 

addr = allocMemory(addr, 100, 3); //100 strings of max length == 3 

然後,當你與地址進行:

freeMemory(addr, 100); //free 100 strings, and associated pointers.