[英]malloc() | difference in memory address length of stack and heap locations | C programming
[英]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”中的一些垃圾的地址
如果您真的想打印堆地址並查看差異,請使用以下幾行修改您的程序:
使用 malloc/alloc 分配一些地址並將已分配內存的指針分配給您的變量:
int *heap_var_ptr = (int *)malloc(sizeof(int));
這會將分配的堆內存地址分配給存儲在堆棧中的指針變量。
現在存儲在指針變量 heap_var_ptr 中的地址來自堆。
printf("heap_var_ptr 在地址 %p\\n",heap_var_ptr);
您將看到這些更改后地址的差異。
而在您的情況下,您沒有使用堆中的任何內存。
因此堆棧地址區域與您的堆指針變量相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.