以下は非常に単純な例です。Mac OS X (Snow Leopard) では gcc を使用して正常にコンパイルされます。実行時に Bus error: 10 を出力します。
char* a = "abc";
a[0] = 'c';
コードは、変更できないリテラル データであるa
へのポインターに設定されます。"abc"
バス エラーは、コードがこの制限に違反し、値を変更しようとすると発生します。
代わりにこれを試してください:
char a[] = "abc";
a[0] = 'c';
これにより、(プログラムの通常のデータ空間に) char 配列が作成され、文字列リテラルの内容が配列に コピーされます。これで、問題なく変更できるはずです。
これ
char* a = "abc";
const char[]
(文字列リテラルのタイプ)から。への危険な暗黙の変換に依存していchar*
ます。(C ++では、この変換は10年以上非推奨になっています。ただし、Cについてはわかりません。)
文字列リテラルは変更しないでください。
文字列定数を変更しようとしています。代わりにこれを使用してください:
char a[] = "abc";
a[0] = 'c';
char *a = "abc"
.data
ELF バイナリのセクションに格納される定数文字列です。このメモリを変更することは許可されておらず、場合によっては未定義の動作が発生した場合、エラーは発生しませんが、メモリを変更しない場合は、通常はアクセスできないメモリにアクセスしようとしているため、バスエラーが発生します(執筆目的)。
char *str = "string";
このような場合、読み取り専用のリテラルとして扱われます。それは書くことに似ていconst char *str = "string"
ます。つまり、ポインターstr
が指す値は定数です。編集しようとすると BUS ERROR になります。