char * a = (char *) malloc(10);
strcpy(a,"string1");
char * x = "string2";
strcat(a,x);
printf("\n%s",a);
这里,我只给a
分配了10B,但是在连接a
和x
(合并大小为16B)之后,C打印了毫无问题地回答。
但是如果我这样做:
char * a = "string1";
char * x = "string2";
strcat(a,x);
printf("\n%s",a);
然后我得到一个段错误。为什么是这样?为什么第一个在内存分配较低的情况下仍然有效? strcat 是否为我重新分配内存?如果是,为什么第二个不起作用?是因为 a
和 x
以这种方式声明的是不可修改的字符串文字吗?
最佳答案
在您的第一个示例中,a 分配在堆中。因此,当您连接另一个字符串时,堆中的某些内容将被覆盖,但没有写保护。
在您的第二个示例中,a 指向包含常量的内存区域,并且是只读的。因此出现段错误。
关于连接字符串 - 需要说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22531337/