-2

可能重复:
无法修改 char* - 内存访问冲突

一直在寻找我用 MingW 编译的 c 程序中的一个问题,最终归结为下面非常简单的测试用例。

当然,目的是更改字符串中的字符。但是这段代码给了我一个分段错误。有人可以解释为什么吗?我不明白...

测试.c:

#include <stdio.h>

main(){
  char *s = "xx";
  printf("(%s)\n", s);
  s[0] = 'z';  // ** Segmentation fault here **
  printf("(%s)\n", s);
}

--

$ gcc -c test.c
$ gcc -o test.exe test.o
$ ./test.exe
(xx)
Segmentation fault
4

2 回答 2

2

编译器可以将字符串“xx”分配到只读内存中。因此,当您尝试更改该内存时,如果它已分配给只读内存,您将遇到分段错误。

如果您的字符串大小是固定的,例如在您的示例中,如果您将字符串定义为字符数组,则不会以只读方式分配内存,并且您不会遇到该问题。

有时,你不知道字符串的最大大小或者你不想浪费空间,所以你需要 malloc() 那个内存,使用 strdup() (它分配内存作为它的函数的一部分),或者其他的相似的。

于 2013-01-27T04:34:19.383 回答
0

谢谢你的帮助。

因此,对于记录,这是有效的:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(){
  char s[] = "xx";
  // or: char *s = malloc(5); strcpy(s, "xx");
  printf("(%s)\n", s);
  s[0] = 'z';  // ** Segmentation fault here **
  printf("(%s)\n", s);
}
于 2013-01-27T04:42:08.630 回答