我总是感到困惑。
下面的代码生成一个分段错误。
请解释一下。。。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char** nameList;
nameList = malloc(4*sizeof(char*));
nameList[0] = malloc(12); //not sure if needed but doesn't work either
nameList[0] = "Hello ";
printf("%s ",nameList[0]);// even this statement isn't executed
strcat(nameList[0], "World");
printf("%s ",nameList[0]);
return 0;
}
最佳答案
您的代码通过写入只读存储并试图在其结束时写入而表现出未定义的行为。
你的想法是朝着正确方向迈出的一步。但是,您应该使用malloc
将strcpy
复制到新分配的内存中。此外,在计算动态分配的大小时,需要考虑要追加的字符串的大小,以及空终止符。
显然,您还需要在程序结束时释放所有分配的内存:
char** nameList;
nameList = malloc(4*sizeof(char*));
nameList[0] = malloc(12);
strcpy(nameList[0], "Hello ");
printf("%s ",nameList[0]);
strcat(nameList[0], "World"); // You were strcat-ing into a wrong element
printf("%s ",nameList[0]);
free(nameList[0]);
free(nameList);
Demo on ideone。