我试图通过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
?
答案 0 :(得分:1)
这是
实现定义,C标准不对malloc
中使用的分配器策略施加任何限制。例如,BSD
使用jemalloc,而glibc可能使用不同的分配器。
可能是未定义的行为。正如Joachim Pileborg已经提到的那样,malloc
返回的内存值是不确定的,访问它可能是未定义的。