2016-05-19 17 views
1

私はmallocfreeでカーテンの裏側を理解しようとしています。そこで私はポインタを予約し、値に影響を与え、解放し、別のmallocコールを使用して同じアドレスを取得しようとしました。同じヒープ位置のMalloc?

int main(void) 
{ 
    int* foo; 
    int* bar = malloc(sizeof *bar); 
    *bar = 42; 
    printf("&bar = %p, bar = %d\n", (void*)bar, *bar); 
    free(bar); 

    foo = malloc(sizeof *foo); 
    printf("&foo = %p, foo= %d\n", (void*)foo, *foo); 

    return 0; 
}   

は、私は何を得ることである...私は以前、この特定の場所に書かれたものと同じ値を得ることを期待していますが、それは何らかの形で異なっている:

&bar = 0x800103a8, bar = 42 
&foo = 0x800103a8, foo= 1630223800 

ですなぜ読み取り値が42と異なる? MMUのためですか?

+5

「malloc」によって与えられたメモリの内容は* indeterminate *です。初期化せずにそれを使用すると、*未定義の動作になります*。初期化するまでメモリを見ないでください。あるいは、[鼻の悪魔](http://www.catb.org/jargon/html/N/nasal-demons.html)をキャッチするかもしれません。 –

+0

また、仮想メモリを持つ最近のシステムでは、*仮想アドレス*( 'malloc'によって返される)は*物理アドレス*(実際のRAMメモリ)と一致する必要はありません。システムがスワッピングまたはファイルマッピングを持っている場合、仮想アドレスはRAMを指していないかもしれません。 –

+0

その答えは 'MMU'のためですが、私の例は' MMU'のないシステムでも動作します – nowox

答えて

1

これは、定義された

  1. 実装され、Cの標準は、戦略がmallocに使用されているどのようなアロケータに制限はありません。たとえばBSDjemallocを使用し、glibcは別のアロケータを使用します。

  2. おそらく未定義の動作です。 Joachim Pileborgですでに述べたように、mallocによって返されるメモリの値は不定であり、アクセスは未定義です。

+0

これは実装に依存しますが、必ずしも未定義の動作ではありません。 indeterminate値がトラップ表現でない場合、それにアクセスすると、指定されていないガベージ値が得られます。 @Lundin True。 – Lundin

+0

しかし、C標準では、トラップ表現を保持しない 'char'しか定義していません。 – Leandros

+0

**実装されていない**実装です。不確定なオブジェクトからの読み込みはUBです。 – Olaf

関連する問題