如果我是正确的,两个 printf 应该显示变量具有相同的地址,因为与此同时没有任何内容被分配到堆,但它显示不同的地址。
#include <stdio.h>
#include <unistd.h>
void *heapTop = NULL;
int main()
{
printf("sbrk(0):%p\n", sbrk(0));
heapTop = sbrk(0);
printf("heapTop: %p\n", heapTop);
return 0;
}
输出:
sbrk(0):0x5b1033f6e000
heapTop: 0x5b1033f8f000
您需要在不调用
printf
或任何其他可能在堆上分配内存的函数的情况下对其进行测试。
#include <stdio.h>
#include <unistd.h>
#include <stddef.h>
#include <stdint.h>
void *heapTop = NULL;
void *heapTop1 = NULL;
void *sbrk(intptr_t increment);
int main()
{
heapTop = sbrk(0);
heapTop1 = sbrk(0);
printf("heapTop: %p\n", heapTop);
printf("heapTop1: %p\n", heapTop1);
return 0;
}
https://godbolt.org/z/zE78M1TaP
结果是一样的:
heapTop: 0x1f2d000
heapTop1: 0x1f2d000