簡體   English   中英

堆棧內存地址區

[英]heap stack memory address area

我目前正在嘗試再次與 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

我的問題是:為什么棧地址區和堆地址區一樣?

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);

您將看到這些更改后地址的差異。


而在您的情況下,您沒有使用堆中的任何內存。
因此堆棧地址區域與您的堆指針變量相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM