我刚刚升级到 MacOS Monterey,我看到在堆上分配内存(malloc/new)时返回的地址有一些不寻常的行为。似乎如果你要求超过 256 个字节,你会得到一个略高于 PAGE_ZERO (0x100000000) 的地址,但如果你要求 256 个字节或更少,你会得到一个高于 0x600000000000 的地址。
我知道 c 库在堆上分配时可以自由地返回它喜欢的任何地址,这对您的代码无关紧要。但是我的代码依赖于位于同一内存区域中的堆地址。我知道这是不好的编程,但这是有原因的。
有没有办法让蒙特雷在同一内存区域分配内存(除了总是分配超过 256 个字节)?谢谢你的任何想法。
示例代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
size_t i,count = 2;
for (i = 0; i < 16; i++)
{
void *ptr = malloc(count);
printf("malloc(%d) returned %p\n",count,ptr);
count *= 2;
}
for (count = 250; count < 260; count++)
{
void *ptr = malloc(count);
printf("malloc(%d) returned %p\n",count,ptr);
}
return 0;
}