私のコードは以下のようなものです:C++のメモリ割り当ての問題
#include <string.h>
int main()
{
int ii = 123;
char str[7] = "";
strcpy(str,"123456");
return 0;
}
私はVS2010でこれを実行し、メモリは、私は、メモリ内のcc
を使用したもの好奇心
以下
のようなものですために?そして、cc
の数はどのように計算されますか?
私のコードは以下のようなものです:C++のメモリ割り当ての問題
#include <string.h>
int main()
{
int ii = 123;
char str[7] = "";
strcpy(str,"123456");
return 0;
}
私はVS2010でこれを実行し、メモリは、私は、メモリ内のcc
を使用したもの好奇心
以下
のようなものですために?そして、cc
の数はどのように計算されますか?
Visual Studioで "デバッグ"用にコンパイルすると、cc
はしばしば初期化されていないメモリを埋めるために使用されます。そうすることで、初期化されていないメモリにアクセスするとより明らかになります。そのような
Access Violation accessing 0xcccccccc
か何か:あなたが初期化されていないポインタ間接参照しようとした場合
たとえば、あなたはおそらくのようなものを得るでしょう。あなたが初期化されていないメモリ空間をアクセスするとき
、VC2010は常に
0xcc
0xcccccccc
を含むいくつかのアドレスにアクセスしたことを警告します初期化されていないメモリを埋める。
そして、MSはなぜ埋め込み値として '0xCC'を選択しましたか? 0xCCはx86命令セットのシングルバイトブレークポイント命令であるためです。こうすることで、不注意なメモリを誤って実行した場合、即座にブレークポイントにヒットします。 –
@Robそれは私が知りませんでした。 :)今私たちはメモリ保護を持っているので、あまり関連性がないと思いますか? – Mysticial
@Mysticial:実際はそうではありません。ページレベルでしか動作しません(ページ全体が実行可能であるかどうかは、CPU、OS、プロセスがNX-bitを有効にすることに同意する場合のみ)。しかし、2KBページのうち40バイトのコードを使用するとどうなりますか?ページには実行可能とマークする必要があります。残りのページは実行可能ですが、ガーベッジは含みます:) – jalf