2017-01-10 114 views
-1

我目前正试图再次联系C,内存使用情况和程序集。 我正在使用Ubuntu(64位)虚拟机。 鉴于波纹管堆栈内存地址区域

#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

我的问题是:为什么堆栈ADRESS区域一样堆地址区域?

+4

正确地打印使用指针['printf'](http://en.cppreference.com/w/c/io/fprintf)与' “%P”'格式。参数是一个'void *'(是的,你需要将指针转换为正确的)。 –

+2

除了其他任何东西,你的代码都有可能使用UB的'printf(“static_var在地址0x%08x \ n”,&static_var);' - >'printf(“static_var在地址%p \ n”, (void *)(&static_var));' – George

+2

您还打印'heap_var_ptr'的未初始化值。由于它没有被初始化,它并没有指向任何地方有效。 –

回答

1

主要内部你的堆指针变量:“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);

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


而在你的情况,你还没有使用从堆的内存。
因此堆栈地址区与堆指针变量相同。