0

当我遍历这个二维指针数组时出现分段错误

宣言:

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));

无论 y 和 x 是什么,循环都会在 addr[2][0] 处返回分段错误

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

3 回答 3

1

X *x = malloc(sizeof *x)分配内存时尝试使用成语:

addr = malloc(y * sizeof *addr);

所以结果sizeof实际上是指您指向的数据的类型:

sizeof *addr == sizeof(char *)
于 2013-11-03T02:32:19.277 回答
1
addr=malloc((y)*sizeof(char));

必须替换为

addr = malloc(y * sizeof(char *)); 
于 2013-11-03T02:30:34.710 回答
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

然后,当您完成 addr 后:

freeMemory(addr, 100); //free 100 strings, and associated pointers.
于 2013-11-03T03:58:46.370 回答