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

时间:2010-02-08 15:50:27

标签: c pointers

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

有人可以解释为什么会这样吗?

4 个答案:

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