2012-03-04 25 views
5

私のコードは以下のようなものです:C++のメモリ割り当ての問題

#include <string.h> 
int main() 
{ 
    int ii = 123; 
    char str[7] = ""; 
    strcpy(str,"123456"); 
    return 0; 
} 

私はVS2010でこれを実行し、メモリは、私は、メモリ内のccを使用したもの好奇心enter image description here

以下

のようなものですために?そして、ccの数はどのように計算されますか?

答えて

7

Visual Studioで "デバッグ"用にコンパイルすると、ccはしばしば初期化されていないメモリを埋めるために使用されます。そうすることで、初期化されていないメモリにアクセスするとより明らかになります。そのような

Access Violation accessing 0xcccccccc 

か何か:あなたが初期化されていないポインタ間接参照しようとした場合

たとえば、あなたはおそらくのようなものを得るでしょう。あなたが初期化されていないメモリ空間をアクセスするとき

enter image description here

+7

そして、MSはなぜ埋め込み値として '0xCC'を選択しましたか? 0xCCはx86命令セットのシングルバイトブレークポイント命令であるためです。こうすることで、不注意なメモリを誤って実行した場合、即座にブレークポイントにヒットします。 –

+0

@Robそれは私が知りませんでした。 :)今私たちはメモリ保護を持っているので、あまり関連性がないと思いますか? – Mysticial

+2

@Mysticial:実際はそうではありません。ページレベルでしか動作しません(ページ全体が実行可能であるかどうかは、CPU、OS、プロセスがNX-bitを有効にすることに同意する場合のみ)。しかし、2KBページのうち40バイトのコードを使用するとどうなりますか?ページには実行可能とマークする必要があります。残りのページは実行可能ですが、ガーベッジは含みます:) – jalf

1

、VC2010は常に

0xcc

は(デバッグビルドで)コンパイラが使用された値にある、あなたは 0xccccccccを含むいくつかのアドレスにアクセスしたことを警告します初期化されていないメモリを埋める。

関連する問題