MingW下的分段 - 故障,当改变字符串中的字符时

时间:2013-01-27 04:24:21

标签: c gcc segmentation-fault mingw

  

可能重复:
  can’t modify char* - Memory access violation

跟踪我用MingW编译的c程序中的问题, 它最终归结为下面非常简单的测试用例。

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

test.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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分: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);
}