跟踪我用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
答案 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);
}