堆栈内存地址区域

时间:2017-01-10 10:54:19

标签: c memory stack heap

我目前正试图再次与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

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

1 个答案:

答案 0 :(得分:1)

你的堆指针变量在main中:&#39; int * heap_var_ptr; &#39;
它将仅以堆栈形式分配(一般为4个字节)。
并获取代码中的地址:
  printf(&#34; heap_var_ptr位于地址0x%08x \ n&#34;,heap_var_ptr);
这只会让你知道存储在heap_var_ptr&#39;

中的一些垃圾

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

  1. 使用malloc / alloc分配一些地址,并将分配的内存指针分配给您的变量:
    int * heap_var_ptr =(int *)malloc(sizeof(int));
    这会将分配的堆内存地址分配给存储在堆栈中的指针变量。

  2. 现在存储在指针变量heap_var_ptr中的地址来自堆 printf(&#34; heap_var_ptr位于地址%p \ n&#34;,heap_var_ptr);

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


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