2016-03-30 5 views
0

私は今OS X 10.10.5を使用している、と私は以下のようにmallocとヒープについての実験をやっている:mallocの戻り値がプロセスメモリマップにないのはなぜですか?

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    int *p; 
    p = malloc(sizeof(int)); 
    *p = 100; 
    printf("the malloc p pointer addr is %x\n", p); 
    getchar(); 
} 

入れてはthe malloc p pointer addr is c3404ba0です。
アドレス0xc3404ba0は、プロセスヒープの一部としてmacllocによって割り当てられていると思います。

は、その後、私は、メモリ・マップを取得するvmmapツールを使用して、結果は次のとおりです。
enter image description here

我々は0xc3404ba0は、ヒープ領域ではありませんが、それは本当に割り当てられたメモリへのポインタだと見ることができます。それのどこが悪いんだい? @Alex垂れに
enter image description here
感謝:。


それは私が代わりに%xの%pを使用した場合、出力はthe malloc p pointer addr is 0x7fe131404ba0
あるとvmmap出力があり、今修正します

+4

が見えます。あなたのプログラムが64ビットモードでコンパイルされている場合、 '%x'を使用してポインタを印刷すると、上位32ビットが切り捨てられます。代わりに '%p'を使って同じことを試し、結果を投稿してください。 –

+0

間違った書式指定子を使用すると**未定義の動作**が発生する** http://stackoverflow.com/q/33648596/995714 http://stackoverflow.com/q/4231891/995714 http://stackoverflow.com/q/14504148/995714 http://stackoverflow.com/q/16864552/995714 –

答えて

4

コメントに書いたように、64ビットOSで動作しているようです。あなたのプログラムが64ビットモードでコンパイルされた場合、%xを使用してポインタを印刷すると、上位32ビットが切り捨てられます(%xは整数に使用されるため)。代わりに%pと同じを試して、結果を投稿してください。

私の推測では、0xXXXXXXXXc3404ba0は、その範囲に属することになります:あなたは64ビットOS上で実行されているよう

enter image description here

関連する問題