6

私はこのコード行を何度も使用しました (更新: string が関数のパラメーターだった場合!)、しかし、今それを実行しようとすると、バス エラーが発生します (gcc と clang の両方で)。可能な限り単純なコードを再現しています。

char *string = "this is a string";
char *p = string;
p++;
*p='x'; //this line will cause the Bus error
printf("string is %s\n",string);

p ポインタを使用して文字列の 2 番目の文字を変更できないのはなぜですか?

4

1 に答える 1

15

読み取り専用メモリ (文字列リテラルが格納されている場所) を変更しようとしています。そのメモリを変更する必要がある場合は、代わりに char 配列を使用できます。

char str[] = "This is a string";
str[0] = 'S'; /* works */

このコード行を何度も使用しました..

ないことを願っています。せいぜい segfault が発生するだけです (読み取り専用メモリを変更しようとすることは不特定の動作であるため、「せいぜい」と言います。この場合、何かが発生する可能性があり、クラッシュが発生する可能性が最も高いため)。

文字列リテラルへのポインターを宣言すると、データ セグメント内の読み取り専用メモリを指します (必要に応じてアセンブリ出力を見てください)。型を char[] として宣言すると、そのリテラルが関数のスタックにコピーされ、必要に応じて変更できるようになります。

于 2010-11-08T23:50:51.263 に答える