4

重複の可能性:
C プログラム文字列リテラル
バス エラー: 10 エラー

CにXcode 4.5.2を使用して、私は思った

char * string = "abc";
string[0] = 'f';

char string[4] = "abc";
string[0] = 'f'; 

同等でした。しかし、最初の行でエラーが発生します。

EXC_BAD_ACCESS (コード = 2、アドレス = 0x100 ...)

そして、2行目でエラーは発生しません。これらはストレート C で同等だと思っていました。何が起こっているのですか?

int main (void) {
    char * string = "abc";   
    string[0] = 'f';
} // main
4

3 に答える 3

9

それらは同じではありません。

char* s = "bla"

上記には、文字列リテラルが格納されているメモリ位置へのポイントがあります。これは読み取り専用メモリ (リテラルは定数) であるため、書き込みは失敗します。

char s[4] = "bla";

sこれにより、 (スタックに割り当てられた)バッファーがリテラルの内容で満たされます。const メモリではないため、このバッファに書き込むことができます。

最初の構文が正当であると見なされ、const の正確性に関連するエラーが発生しない理由は、古いバージョンの c との下位互換性を維持することに関係しています。

于 2013-01-29T01:33:43.957 に答える
1

あなたが発見したように、これらは同等ではありません。1 つ目は、文字列定数が定数 (つまりconst char * const) であるため、未定義の動作です。それらは読み取り専用メモリにある可能性があり(アクセスが悪い、アドレス0x100が良い手がかりです)、最初のstring( .)を介して変更しようとしていますchar *。2 つ目stringは、実際にはchar変更可能なストレージ (この場合はスタック上) を持つ配列です。

于 2013-01-29T01:30:15.167 に答える
0

最初のポインタは、プログラムからの文字列がロードされる保護されたメモリを指します。

2 番目のポインターは、新しく割り当てられた 4 文字のフィールドを指します。

したがって、最初のフィールドに書き込むと、メモリへの不正アクセスが報告されます。

于 2013-01-29T01:32:52.470 に答える