我目前正试图再次与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
我的问题是:为什么堆栈地址区域与堆地址区域相同?
答案 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;
如果您真的想要打印堆的地址并查看差异,请使用以下行修改您的程序:
使用malloc / alloc分配一些地址,并将分配的内存指针分配给您的变量:
int * heap_var_ptr =(int *)malloc(sizeof(int));
这会将分配的堆内存地址分配给存储在堆栈中的指针变量。
现在存储在指针变量heap_var_ptr中的地址来自堆 printf(&#34; heap_var_ptr位于地址%p \ n&#34;,heap_var_ptr);
在这些更改后,您将看到地址的差异。
而在您的情况下,您没有使用堆中的任何内存。
因此堆栈地址区域与堆指针变量相同。