これには実行時エラーはありません
int main()
{
char *p = "Hello";
}
これにより、実行時エラーが発生します
int main()
{
int *p;
*p = 5;
}
これが起こっている理由を理解できません。どんな種類の助けにも感謝します。
これには実行時エラーはありません
int main()
{
char *p = "Hello";
}
これにより、実行時エラーが発生します
int main()
{
int *p;
*p = 5;
}
これが起こっている理由を理解できません。どんな種類の助けにも感謝します。
最初の例p
は、リテラル文字列へのポインターをp
指しているため、有効なメモリを指しています。
あなたのセクションはポインタを宣言していますp
が、メモリアドレスを指していません。次に、次のステートメントが*p = 5
逆参照し、ポインターに格納されているメモリ アドレスに格納p
しようとします。有効なメモリを指定していないため、アプリケーションがクラッシュします。5
p
p
2 番目のスニペットは、ポインターが初期化されていないため、未定義の動作です。
最初のスニペットでも問題が発生する可能性がありますconst char *p = "Hello";
。これは、文字列テキストが C ランタイム ライブラリによって文字列リテラルのテーブルに追加されるためです。それを変更するのは未定義の動作です。を使用const
すると、それを強制するのに役立ちます。
最初のプログラムはポインターの値を設定し、明確に定義されています (文字列を変更しようとしない限り)。
2 番目のプログラムは、初期化されていないポインターを介して値を代入します (したがって、動作は未定義です)。
以下は、最初のプログラムとほぼ同等ですが、 を使用していint
ます。
int main()
{
int val = 5;
int *p = &val;
}