【问题标题】:Why does my variable on the heap sometimes have a higher address than a stack variable为什么我在堆上的变量有时比堆栈变量的地址更高
【发布时间】: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

有时堆变量的地址比我的堆栈变量高。 为什么会发生这种情况?我认为堆栈从高内存地址开始,而堆从低内存地址开始?

memory layout

我的操作系统是popOs

【问题讨论】:

  • 使用%p 格式化地址。您可能会打印出 8 字节地址中较不重要的 4 个字节。
  • 启用警告并修复它们(printf 格式说明符应该给你一个关于类型的警告。
  • 通过使用 %p 似乎可以工作。现在输出的地址也与 /proc//maps 中的堆栈和堆的位置匹配
  • 我怀疑“进程内存布局”图适用于与您使用的操作系统不同的操作系统。

标签: c


【解决方案1】:

您的 C 实现具有 64 位指针和 32 位 unsigned int,而 %x 用于 unsigned int。使用%x,您的 C 实现仅打印指针的低 32 位。

此外,使用%x 打印指针的行为不是由 C 标准定义的。

要正确打印指针,请将其转换为void * 并使用%p 打印:

printf("stack_var is at adress %p\n", (void *) &stack_var);
printf("heap_var is at adress  %p\n", (void *) heap_var_ptr);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 2013-11-13
    • 2021-10-13
    • 2014-02-28
    相关资源
    最近更新 更多