C 更改字符串中的字符时,MingW下的分段错误
可能重复:C 更改字符串中的字符时,MingW下的分段错误,c,gcc,segmentation-fault,mingw,C,Gcc,Segmentation Fault,Mingw,可能重复: 一直在追踪我用MingW编译的c程序中的一个问题, 它最终归结为下面非常简单的测试用例 当然,其目的是更改字符串中的字符。 但是这个代码给了我一个分段错误。 有人能解释一下原因吗?我不明白 测试c: #include <stdio.h> main(){ char *s = "xx"; printf("(%s)\n", s); s[0] = 'z'; // ** Segmentation fault here ** printf("(%s)\n", s
一直在追踪我用MingW编译的c程序中的一个问题, 它最终归结为下面非常简单的测试用例 当然,其目的是更改字符串中的字符。 但是这个代码给了我一个分段错误。 有人能解释一下原因吗?我不明白 测试c:
#include <stdio.h>
main(){
char *s = "xx";
printf("(%s)\n", s);
s[0] = 'z'; // ** Segmentation fault here **
printf("(%s)\n", s);
}
编译器可以将字符串“xx”分配到只读内存中。因此,当您试图更改该内存时,如果已将其分配给只读内存,则会出现分段错误
在字符串大小固定的情况下,例如在示例中,如果将字符串定义为字符数组,则不会以只读方式分配内存,也不会出现此问题
有时,您不知道字符串的最大大小,或者不想浪费空间,因此需要对该内存进行malloc(),使用strdup()(它将内存分配为其函数的一部分)或类似的操作。谢谢您的帮助
因此,对于记录,这是有效的:
#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);
}
#包括
#包括
#包括
void main(){
字符s[]=“xx”;
//或:char*s=malloc(5);strcpy(s,“xx”);
printf((%s)\n),s);
s[0]=“z”;//**此处存在分段错误**
printf((%s)\n),s);
}
重复数百次。简短回答-试图修改字符串文字会导致未定义的行为。您可能打算使用chars[]=“xx”
.editive note-不声明main()
的返回类型是草率的编程。这是针对MingW的吗?还是去窗户?好吧,它适用于我使用过的每一个*nix环境。也许你很幸运。任何相对现代的机器(具有内存保护)都会显示与您看到的相同的行为。未定义的行为有时会产生工作代码,但这是在欺骗自己。malloc
对于这个程序来说是相当重要的。简单地声明一个数组就足够了。@Carl:这是一个非常明智的观点,我认为我的答案中的这一部分比没有给出OP的代码要错误得多。我已经相应地更新了我的答案。
#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);
}