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

aks*_*aks 2 c pointers

代码:

#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)

它会将文字复制到您可以修改的内容中.

  • @aks因为C标准这样说.我们的想法是编译器可能将它们放在只读存储器中.但是,该标准并不要求编译诊断出像你这样的问题 - 它说你得到的是"未定义的行为",在你的情况下是一个seg错误. (3认同)

ken*_*ytm 5

因为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)