代码:
#include "stdio.h"
#include "string.h"
int main()
{
char *p = "abc";
printf("p is %s \n", p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
Segmentation fault (core dumped)
有人能解释为什么会这样吗?
小智 8
在你的代码中:
char *p="abc";
Run Code Online (Sandbox Code Playgroud)
p指向字符串文字 - 您不允许更改字符串文字,这是您调用strcpy尝试执行的操作.相反,使p成为一个数组:
char p[] = "abc";
Run Code Online (Sandbox Code Playgroud)
它会将文字复制到您可以修改的内容中.
因为p指向一个只读内存区域(__TEXT段),其中包含字符串“ abc”。
当你strcpy这样做时,只读内存区域将被覆盖,这是非法的。这样内核就会对你的程序进行SegFault。
如果想要可写内存,需要在栈上分配
char p[1024] = "abc";
Run Code Online (Sandbox Code Playgroud)
或者在堆上
char* p = malloc(1024);
...
free(p);
Run Code Online (Sandbox Code Playgroud)
或在 __DATA 段中(即全局变量)
static char p[1024] = "abc";
Run Code Online (Sandbox Code Playgroud)