我知道这个问题(或类似问题)被多次询问过,但我仍然在努力寻找一个好的答案,所以请不要将其标记为重复。我正在尝试为两个字符串数组分配内存。字符串长度为500和1000个字符串,字符串数在运行时已知。这是我的代码:
char *arrOfPrompts = (char*)calloc(500*maxR, sizeof(char));
char *arrOfPhonePrompts = (char*)calloc(1000*maxR, sizeof(char));
char **prompts = (char**)calloc(maxR, sizeof(char*));
char **phonePrompts = (char**)calloc(maxR,sizeof(char*));
for (int i = 0; i<maxR; i++)
{
prompts[i] = arrOfPrompts+(i*500);
phonePrompts[i] = arrOfPhonePrompts+(i*1000);
(prompts[i])[i*500] = '\0';
(phonePrompts[i])[i*500] = '\0';
}
..其中maxR
是数组的数量。所以我正在做的是创建一个长char数组,然后存储500个偏移量的字符串。这是一种合法的做法吗?看起来很难看。另外,我把&#39; \ 0&#39;每个&#34;字符串&#34;开头的字符是因为我想使用strcat
追加它。这有什么潜在的问题吗?
感谢。
答案 0 :(得分:3)
以下几行不对。他们最终会修改内存超出你分配的内容。
(prompts[i])[i*500] = '\0';
(phonePrompts[i])[i*500] = '\0';
我们说maxR
是10
。
arrOfPrompts
指向5000
个字符数组。
在for
循环中,您使用:
prompts[i] = arrOfPrompts+(i*500);
这意味着prompts[9]
从第4501
个字符开始指向内存。
prompt[i][i*500]
, prompt[9][4500]
为i = 9
。这将最终访问距离您分配的内存4000
元素的字符。
由于您使用calloc
来分配内存,因此无需再执行任何操作来创建空字符串。
如果你想要这样做,你可以使用:
prompts[i][0] = '\0';
phonePrompts[i][0] = '\0';
答案 1 :(得分:2)
您的代码似乎很好,但有时可能会产生意外结果。 另一种分配二维chars数组的方法是: -
//r=number of rows
//c=number of columns
char **arr = (char **)malloc(r * sizeof(char *));
for (i=0; i<r; i++)
arr[i] = (char *)malloc(c * sizeof(char));