码:
#include "stdio.h"
#include "string.h"
int main()
{
char *p = "abc";
printf("p is %s \n", p);
return 0;
}
输出:
p is abc
码:
#include "stdio.h"
#include "string.h"
int main()
{
char *p = "abc";
strcpy(p, "def");
printf("p is %s \n",p);
return 0;
}
输出:
Segmentation fault (core dumped)
有人可以解释为什么会这样吗?
答案 0 :(得分:8)
在您的代码中:
char *p="abc";
指向字符串文字 - 不允许更改字符串文字,这是你对strcpy的调用所要做的。相反,make p a array:
char p[] = "abc";
将文字复制到允许修改的内容中。
答案 1 :(得分:4)
因为p
指向只读内存区域(__TEXT段),其中包含字符串“abc
”。
当你strcpy
时,只读内存区域将被覆盖,这是非法的。所以内核将SegFault你的程序。
如果你想要可写内存,你需要在堆栈上分配它
char p[1024] = "abc";
或在堆上
char* p = malloc(1024);
...
free(p);
或__DATA段(即全局变量)
static char p[1024] = "abc";
答案 2 :(得分:2)
因为p指向只读存储器。
覆盖p指向的数据会导致未定义的行为。 字符串文字是您在引号中明确指定的任何字符串。所有字符串文字都是只读的。 (注意:您可以使用字符串文字来初始化char数组。)
你需要改为分配你自己的缓冲区:
char buffer[4];
strcpy(buffer, "def");
printf("buffer is %s \n", buffer);
答案 3 :(得分:1)
p
基本上只是指向只读数据的指针(在你的情况下是“abc”)。你不能用“def”覆盖它。