【发布时间】:2021-12-27 12:24:45
【问题描述】:
我正在运行这段代码来获取堆栈变量和堆变量的内存地址
int main()
{
int stack_var = 5;
int *heap_var_ptr = (int*) malloc(4);
printf("stack_var is at adress %x\n", &stack_var);
printf("heap_var is at adress %x\n", heap_var_ptr);
}
输出:
stack_var is at adress 41a13efc
heap_var is at adress b09ec2a0
有时堆变量的地址比我的堆栈变量高。 为什么会发生这种情况?我认为堆栈从高内存地址开始,而堆从低内存地址开始?
我的操作系统是popOs
【问题讨论】:
-
使用
%p格式化地址。您可能会打印出 8 字节地址中较不重要的 4 个字节。 -
启用警告并修复它们(printf 格式说明符应该给你一个关于类型的警告。
-
通过使用 %p 似乎可以工作。现在输出的地址也与 /proc/
/maps 中的堆栈和堆的位置匹配 -
我怀疑“进程内存布局”图适用于与您使用的操作系统不同的操作系统。
标签: c