为什么我不能使用此代码覆盖字符串?
代码 :
#include "stdio.h" #include "string.h" int main() { char *p = "abc"; printf("p is %s \n", p); return 0; }
输出 :
p是abc
代码 :
#include "stdio.h" #include "string.h" int main() { char *p = "abc"; strcpy(p, "def"); printf("p is %s \n",p); return 0; }
输出 :
分段故障(核心转储)
有人能解释为什么会这样吗?
因为p指向只读存储器。
覆盖p指向的数据会导致未定义的行为。 字符串文字是您在引号中明确指定的任何字符串。 所有字符串文字都是只读的。 (注意:您可以使用字符串文字来初始化char数组。)
您需要改为分配自己的缓冲区,如下所示:
char buffer[4]; strcpy(buffer, "def"); printf("buffer is %s \n", buffer);
在你的代码中:
char *p="abc";
p指向字符串文字 – 不允许更改字符串文字,这是您调用strcpy尝试执行的操作。 相反,使p成为一个数组:
char p[] = "abc";
它会将文字复制到您可以修改的内容中。
因为p
指向包含字符串“ abc
”的只读存储器区域(__TEXT段)。
当你strcpy
它时,一个只读的内存区域将被覆盖,这是非法的。 所以内核将SegFault你的程序。
如果需要可写内存,则需要在堆栈上分配它
char p[1024] = "abc";
或者在堆上
char* p = malloc(1024); ... free(p);
或者在__DATA段(即全局变量)
static char p[1024] = "abc";
p
基本上只是指向只读数据的指针(在你的例子中是“abc”)。 你不能用“def”覆盖它。