当我遍历这个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';
}
}
答案 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.