-2

重複の可能性:
char* を変更できません - メモリ アクセス違反

MingW でコンパイルした C プログラムの問題を追跡していて、最終的に以下の非常に単純なテストケースに行き着きました。

もちろん、意図は文字列内の文字を変更することです。しかし、このコードではセグメンテーション違反が発生します。誰かが理由を説明してもらえますか? 理解できません...

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
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 に答える