0
main()
{       
int *p;

free(p);
}

このコードは Win 2K でクラッシュします。しかし、どういうわけかWin XPでクラッシュしません! 理由はありますか?

編集:はい。これはバグであり、書くべきではありません。詳細情報: 使用されたコンパイラは VC 6 コンパイラでした。Win XP マシンでコードをリリース モードでコンパイルしました。Win Xp を搭載した複数のマシンで、このコードを使用して実行可能ファイルを実行しました。コードはクラッシュしませんでした。しかし、複数の Win 2K マシンで同じコードを実行しました。それは毎回クラッシュしました!!

4

3 に答える 3

6

これは未定義の動作です。Undefined Behavior がどのように動作するかについてのルールはありません。

于 2013-04-24T09:21:02.433 に答える
1

あなたのコードは未定義の動作です: 初期化されていないポインターを (実際には無料で) 使用しようとしています。

これは UB であるため、なぜ 1 つの OS で動作する (または動作するように見える) のに別の OS では動作しないのかを理解しようとすることはまったく関係ありませ

于 2013-04-24T09:21:10.570 に答える
0

それはまさにそのままのコードですか?つまり、その間に p を初期化するものは何もありませんか?

お使いの XP システムでは、コンパイラが p を NULL に初期化していると思います (そうする必要はないと思いますが、そうなっているだけです)。2K システムでは、コンパイラは *p をスタックに追加するだけで、値は何でもかまいません。

Free(p) は NULL ポインターを正しく処理しますが、2K システムがスタック上に作成されたときにポインターをゼロにしていなかった場合 (これは C 標準では必要ないと思います)、dnagling の可能性があり、したがって解放されます。 (p) 任意のメモリを解放しようとする可能性があり、問題が発生します。

から始めると

int *p = NULL;
free(p);

これは動作を変更しますか?

于 2013-04-24T09:21:59.840 に答える