分段故障循环通过二维指针数组

时间:2013-11-03 02:27:33

标签: c loops pointers segmentation-fault

当我遍历这个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));
无论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';
        }
}

3 个答案:

答案 0 :(得分:1)

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

必须替换为

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

答案 1 :(得分:1)

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

addr = malloc(y * sizeof *addr);

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

sizeof *addr == sizeof(char *)

答案 2 :(得分: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.