堆栈内存地址区域

问题描述 投票:-1回答:1

我目前正试图再次与C,内存使用和组装联系。我正在使用Ubuntu(64位)VM。鉴于代码吼叫

#include <stdio.h>

int global_var;
int global_init_var=5;

void function(){
    int stack_var;
    printf("functions stack_var is at",&stack_var);
}

int main(){
    int stack_var;
    static int static_init_var=5;
    static int static_var;
    int *heap_var_ptr;

    printf("global_init_var is at adress 0x%08x\n",&global_init_var);
    printf("static_init_var is at adress 0x%08x\n",&static_init_var);
    printf("static_var is at adress 0x%08x\n",&static_var);
    printf("global_var is at adress 0x%08x\n",&global_var);
    printf("heap_var_ptr is at adress 0x%08x\n",heap_var_ptr);
    printf("stack_var is at adress 0x%08x\n",&stack_var);
    function();
}

我得到输出:

global_init_var位于0x00601040

static_init_var位于0x00601044

static_var位于0x0060104c

global_var位于0x00601050

heap_var_ptr位于0xb9f8dd00

stack_var位于0xb9f8dcfc

函数stack_var位于0xb9f8dcd4

我的问题是:为什么堆栈地址区域与堆地址区域相同?

c memory stack heap
1个回答
1
投票

你的堆指针变量在main里面:'int * heap_var_ptr;' 它将仅以堆栈形式分配(通常为4个字节)。 并获取代码中的地址: printf(“heap_var_ptr位于地址0x%08x \ n”,heap_var_ptr); 这只会让你获得存储在'heap_var_ptr'里面的一些垃圾的地址

如果您真的想要打印堆的地址并查看差异,请使用以下行修改您的程序:

  1. 使用malloc / alloc分配一些地址,并将分配的内存指针分配给您的变量: int * heap_var_ptr =(int *)malloc(sizeof(int)); 这会将分配的堆内存地址分配给存储在堆栈中的指针变量。
  2. 现在存储在指针变量heap_var_ptr中的地址来自堆。 printf(“heap_var_ptr位于地址%p \ n”,heap_var_ptr);

在这些更改后,您将看到地址的差异。

而在您的情况下,您没有使用堆中的任何内存。 因此堆栈地址区域与堆指针变量相同。

© www.soinside.com 2019 - 2024. All rights reserved.