2017-11-08 15 views
1

以下のコードを実行すると、セグメンテーションフォルトが発生します。このエラーの原因は何でしょうか?助けてくださいcharポインタ内のセグメンテーションフォルト

int main() 
{ 
    char *str2 = "Hello"; 
    str2[3] = 'J'; 
    printf("%s\n",str2); 
    return 0; 
} 
+4

文字列定数は不変です 'char型のSTR2 [] =試してみてください。『こんにちは』。この文言で' –

答えて

7

string literalの内容を変更しようとしているため、は未定義の動作です。主にに格納されている文字列リテラルは、読み取り専用ロケーションです。変更しないでください。それ以外の場合は、未定義のビヘイビアが呼び出されます。

C11§6.4.5文字列リテラル(パラグラフ7):

これらの配列は、それらの 要素が適切な値を有する別個設けられているかどうかを指定されていません。 へのプログラムの試行は、いずれかの形式の文字列リテラルを変更した場合、動作は未定義である」

+1

'文字列リテラルは読み込み専用の場所に格納されています.'ですが、これは必須ではありません。 –

3

文字列定数を変更することはできません。この場合、実行時エラーが発生しています。あなたはstr2への宣言を変更することにより、それを修正することができます:

char str2[] = "Hello"; 

これはそれを配列ではなく、一定の文字列へのポインタになります。

2

文字列リテラルで初期化された変数char*が指すメモリを変更することはできません。読み取り専用です。

+0

は何、?それは間違っています –

+0

'char * p =" test "、p =" test again ";' –

+0

編集されました。その言葉では間違っていました。文字列リテラルを割り当てた後は、読み取り専用です。 – Matt

関連する問題