Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 更改字符串中的字符时,MingW下的分段错误_C_Gcc_Segmentation Fault_Mingw - Fatal编程技术网

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);
}