"栈是在顶层地址和堆中创建的
低级地址”请详细说明
这是一个神话。它可能有历史真相的基础。它有时可能会与您在现实生活中看到的事物产生共鸣。但事实并非如此。
不过,探索起来很容易:
#include <stdlib.h>
#include <stdio.h>
void check(int depth) {
char c;
char *ptr = malloc(1);
printf("stack at %p, heap at %p\n", &c, ptr);
if (depth <= 0) return;
check(depth-1);
}
int main() {
check(10);
return 0;
}
在我的机器上我看到了:
stack at 0x22ac3b, heap at 0x20010240
stack at 0x22ac0b, heap at 0x200485b0
stack at 0x22abdb, heap at 0x200485c0
stack at 0x22abab, heap at 0x200485d0
stack at 0x22ab7b, heap at 0x200485e0
stack at 0x22ab4b, heap at 0x200485f0
stack at 0x22ab1b, heap at 0x20048600
stack at 0x22aaeb, heap at 0x20048610
stack at 0x22aabb, heap at 0x20048620
stack at 0x22aa8b, heap at 0x20048630
stack at 0x22aa5b, heap at 0x20048640
因此,堆栈向下,堆向上(正如您根据神话所期望的那样),但堆栈的地址更小,并且它们没有朝着彼此增长(神话破灭)。
顺便说一句,我的check 函数是尾递归的,在某些带有一些编译器选项的实现中,您可能会看到堆栈根本没有移动。这告诉您为什么该标准不强制要求所有这些工作方式 - 如果这样做可能会无意中禁止有用的优化。