私はmalloc
とfree
でカーテンの裏側を理解しようとしています。そこで私はポインタを予約し、値に影響を与え、解放し、別の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
のためですか?
「malloc」によって与えられたメモリの内容は* indeterminate *です。初期化せずにそれを使用すると、*未定義の動作になります*。初期化するまでメモリを見ないでください。あるいは、[鼻の悪魔](http://www.catb.org/jargon/html/N/nasal-demons.html)をキャッチするかもしれません。 –
また、仮想メモリを持つ最近のシステムでは、*仮想アドレス*( 'malloc'によって返される)は*物理アドレス*(実際のRAMメモリ)と一致する必要はありません。システムがスワッピングまたはファイルマッピングを持っている場合、仮想アドレスはRAMを指していないかもしれません。 –
その答えは 'MMU'のためですが、私の例は' MMU'のないシステムでも動作します – nowox