8

以下は非常に単純な例です。Mac OS X (Snow Leopard) では gcc を使用して正常にコンパイルされます。実行時に Bus error: 10 を出力します。

char* a = "abc";
a[0] = 'c';
4

5 に答える 5

10

コードは、変更できないリテラル データであるaへのポインターに設定されます。"abc"バス エラーは、コードがこの制限に違反し、値を変更しようとすると発生します。

代わりにこれを試してください:

char a[] = "abc";
a[0] = 'c';

これにより、(プログラムの通常のデータ空間に) char 配列が作成され、文字列リテラルの内容が配列に コピーされます。これで、問題なく変更できるはずです。

于 2011-09-20T05:44:57.947 に答える
3

これ

char* a = "abc";

const char[](文字列リテラルのタイプ)から。への危険な暗黙の変換に依存していchar*ます。(C ++では、この変換は10年以上非推奨になっています。ただし、Cについてはわかりません。)

文字列リテラルは変更しないでください。

于 2011-09-20T05:54:55.717 に答える
3

文字列定数を変更しようとしています。代わりにこれを使用してください:

char a[] = "abc";
a[0] = 'c';
于 2011-09-20T05:40:20.880 に答える
1

char *a = "abc".dataELF バイナリのセクションに格納される定数文字列です。このメモリを変更することは許可されておらず、場合によっては未定義の動作が発生した場合、エラーは発生しませんが、メモリを変更しない場合は、通常はアクセスできないメモリにアクセスしようとしているため、バスエラーが発生します(執筆目的)。

于 2011-09-20T05:41:37.330 に答える
1

char *str = "string";このような場合、読み取り専用のリテラルとして扱われます。それは書くことに似ていconst char *str = "string"ます。つまり、ポインターstrが指す値は定数です。編集しようとすると BUS ERROR になります。

于 2011-09-20T06:43:34.557 に答える