2013-11-03 26 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.