0

そうです

char ch = 'c';

その後

char *char_ptr = &ch;
*(char_ptr+1) = 'h';
*(char_ptr+2) = '\0';

を使用して印刷すると、これは正しく機能します

printf("char_ptr as string = %s\n", char_ptr);

しかし、私がするとき

char *char_ptr = 'c';
*(char_ptr+1) = 'h';
*(char_ptr+2) = '\0';

次に、セグメンテーション違反が発生します。この背後にある理由は何ですか?

4

4 に答える 4

4

'c'は整数定数で、ASCII システムでは に評価され0x63ます。

それとその直後のアドレスは、ほとんどの場合、情報を突っ込み始めるには無効なアドレスになります。

実際、最初のものでさえ、1ch文字しか割り当てられておらず、それを超えて情報を変更しようとしているため、未定義の動作です。コンパイラがメモリとスタック フレームをどのようにレイアウトするかによってはうまくいくかもしれませんが、それでも非常に悪い考えです

これを行うより正しい方法は次のとおりです。

char char_ptr[3] = "c";    // Allocate three bytes to ensure room.
*(char_ptr+1) = 'h';       // or char_ptr[1] = 'h';
*(char_ptr+2) = '\0';      // or char_ptr[2] = '\0';
于 2013-10-30T03:39:44.093 に答える