我想了解动态分配的数组在 C 99 中是如何工作的。无论如何,我有以下代码:
int main()
{
char** members=malloc(4*sizeof(*members));
*members=malloc(5);
*members="john";
*(members+1)="shouldn't work";
printf("%s \n",*members);
printf("%s",*(members+1));
return 0;
}
我以为我会得到一个运行时错误,因为我没有分配 (members+1),但实际上它确实打印了“john”和“shouldn't work”,而且,它看起来像 *members= malloc(5) 行不是必需的。为什么?
最佳答案
您的作业并没有按照您认为的那样进行。当您分配 *members
或 *(members+1)
时,您是将 char*
分配给每个字符串文字,而不是将其复制到已分配(或未分配)堆内存。
如果您用 strcpy
替换您的作业,即:
strcpy(*members, "john");
strcpy(*(members+1), "shouldn't work");
然后您将在第二次分配时遇到访问冲突,但不会在第一次分配时发生。同样,malloc(5)
似乎没有必要的原因是您将指针重新分配为指向字符串文字,而不是将“john”字符串复制到分配的内存中。
关于c - C中动态分配的字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29814001/