0

これには実行時エラーはありません

int main()
{
    char *p = "Hello"; 
} 

これにより、実行時エラーが発生します

int main()
{
   int *p; 
   *p = 5; 
}

これが起こっている理由を理解できません。どんな種類の助けにも感謝します。

4

3 に答える 3

4

最初の例pは、リテラル文字列へのポインターをp指しているため、有効なメモリを指しています。

あなたのセクションはポインタを宣言していますpが、メモリアドレスを指していません。次に、次のステートメントが*p = 5逆参照し、ポインターに格納されているメモリ アドレスに格納pしようとします。有効なメモリを指定していないため、アプリケーションがクラッシュします。5pp

于 2013-10-26T20:10:35.993 に答える
2

2 番目のスニペットは、ポインターが初期化されていないため、未定義の動作です。

最初のスニペットでも問題が発生する可能性がありますconst char *p = "Hello";。これは、文字列テキストが C ランタイム ライブラリによって文字列リテラルのテーブルに追加されるためです。それを変更するのは未定義の動作です。を使用constすると、それを強制するのに役立ちます。

于 2013-10-26T20:10:20.550 に答える
1

最初のプログラムはポインターの値を設定し、明確に定義されています (文字列を変更しようとしない限り)。

2 番目のプログラムは、初期化されていないポインターを介して値を代入します (したがって、動作は未定義です)。

以下は、最初のプログラムとほぼ同等ですが、 を使用していintます。

int main()
{
   int val = 5;
   int *p = &val;
}
于 2013-10-26T20:10:17.413 に答える