0

次のプログラムでは、 p はポインターとして宣言されています (これは定数ですが、文字列ではありません)。しかし、それでもプログラムは動作せず、「untitled2.exe が動作を停止しました」と言って突然停止します。

#include<stdio.h>
#include<stdlib.h>

int main(){
    char * const p = "hello";
    *p = 'm';
    return 0;
}

この予期しない動作はなぜですか?

4

3 に答える 3

2
char * const p = "hello";

定数ポインタを定義し、本質的に 型でpある定数文字列のメモリ アドレスで初期化します。この割り当てにより、修飾子を破棄しています。これは有効な C ですが、何をしているのかわからないと未定義の動作につながります。"hello"const char *const

指しconst char *ているメモリの内容を変更することは禁止されていますが、アドレスを変更することは禁止されていませんがchar * const、内容を変更することは許可されていますが、アドレスは固定されています。コンボバージョンもありconst char * constます。

これは有効な C コードですが、OS の配置と制限によっては"hello"、書き込み可能なメモリになる場合とそうでない場合があります。これは未定義のままです。経験則として、定数文字列は実行可能プログラムのテキストの一部であり、読み取り専用です。したがって、書き込みを試みると*p、メモリ パーミッション エラーが発生しますSIGSEGV

正しい方法は、文字列の内容をスタックにコピーしてそこで作業することです。

char p[] = "hello";

*p読み取り/書き込み可能なスタック上にあるため、変更できるようになりました。グローバルに同じものが必要な場合は、グローバル スコープに入れます。

于 2013-06-17T10:39:33.187 に答える