malloc()を使用してヒープ上で1バイトを占有したにもかかわらず、以下のコードが成功した理由:
char* sp=(char*)malloc(1);
strcpy(sp,"aaaaa");
sp
ヒープサイズは1バイトでaaaa
、1バイト以上を処理できます。どうして!
私はMSVS2010を使用しています。
malloc()を使用してヒープ上で1バイトを占有したにもかかわらず、以下のコードが成功した理由:
char* sp=(char*)malloc(1);
strcpy(sp,"aaaaa");
sp
ヒープサイズは1バイトでaaaa
、1バイト以上を処理できます。どうして!
私はMSVS2010を使用しています。
これは未定義動作と呼ばれ、現時点では機能しているように見える場合があります。しかし、おそらく奇妙で一見無関係なことが後で起こります。
これは未定義動作と呼ばれます。マシン上のコンパイラに問題がないように見えるからといって、別のコンパイラまたは別のプラットフォームが同じように動作することを意味するわけではありません。(ヒント:このユースケースは単純であるため、悪影響は見られません。さらに複雑になると、大きな問題が発生します。)
事実上、割り当ては割り当てをオーバーフローします。その場合に何が起こるかは、コンパイラと特定のC /C++ランタイム次第です。一部のプラットフォームでは、これによりセグメンテーション違反またはアクセス違反が発生します(特に、Electric FenceやValgrindなどのデバッグ支援機能を使用している場合)。
このようなコードを使用した最良のシナリオは、すぐにクラッシュすることです。コードがクラッシュしない場合は、別のメモリ割り当てが破損している可能性があり、アプリケーションは後でクラッシュまたはデータを破損します。これは、いわゆる「時限爆弾」バグです。アプリケーションがクラッシュするポイントはどこにでもある可能性があり、おそらく悪いコードの近くにはない可能性があるため、時限爆弾のデバッグははるかに困難です。
ヒープの割り当ては、協調的な演習です。割り当てられたスペースの終わりを上書きすると、うまくプレイできなくなり、悪いことが起こります。
割り当てられたスペース内にとどまるのはあなたの仕事です。誰もあなたが最後を越えたり、あなたのプログラムに属するメモリのランダムなビットに書き込んだりするのを止めることはありませんが、結果は予測できません。(これは「悪い」のコードです)。