将内存分配给C中的字符串数组

时间:2015-08-22 21:47:13

标签: c arrays string pointers

我知道这个问题(或类似问题)被多次询问过,但我仍然在努力寻找一个好的答案,所以请不要将其标记为重复。我正在尝试为两个字符串数组分配内存。字符串长度为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追加它。这有什么潜在的问题吗?

感谢。

2 个答案:

答案 0 :(得分:3)

以下几行不对。他们最终会修改内存超出你分配的内容。

    (prompts[i])[i*500] = '\0';
    (phonePrompts[i])[i*500] = '\0';

我们说maxR10

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