Malloc 在同一个堆位置?
Malloc at the same heap location?
我想了解 malloc
和 free
幕后的情况。所以我尝试保留一个指针,影响一个值,释放它并使用另一个 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
?
这是
实现已定义,C 标准不对 malloc
中使用的分配器策略施加任何限制。例如,BSD
使用 jemalloc,而 glibc 可能使用不同的分配器。
可能是未定义的行为。正如Joachim Pileborg已经提到的,malloc
返回的内存值是不确定的,访问它可能是未定义的。
我想了解 malloc
和 free
幕后的情况。所以我尝试保留一个指针,影响一个值,释放它并使用另一个 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
?
这是
实现已定义,C 标准不对
malloc
中使用的分配器策略施加任何限制。例如,BSD
使用 jemalloc,而 glibc 可能使用不同的分配器。可能是未定义的行为。正如Joachim Pileborg已经提到的,
malloc
返回的内存值是不确定的,访问它可能是未定义的。