为什么我不能使用此代码覆盖字符串?

代码

#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”覆盖它。