2013-12-22 108 views
2

我已在下面的代码段:存储器分配和堆栈

#include <stdio.h> 

int global_var; 

int global_initialized_var=5; 

void function(){ 
int stack_var; 

printf("The function's stack_var is at address 0x%08x\n", &stack_var); 
} 


int main(){ 
int stack_var; 
static int static_initialized_var = 5; 
static int static_var; 
int *heap_var_ptr; 

heap_var_ptr = (int *) malloc(4); 

// Next variables will be at data segment 

printf("global_initialized_var is at address 0x%08x\n", &global_initialized_var); 
printf("static_initialized_var is at address 0x%08x\n\n", &static_initialized_var); 

// These will be in the bss segment 

printf("static_var is at address 0x%08x\n", &static_var); 
printf("global_var is at address 0x%08x\n", &global_var); 

// This will be in heap segment 

printf("heap_var is at address 0x%08x\n\n", heap_var_ptr); 

// These will be in stack segment 

printf("stack_var is at address 0x%08x\n", &stack_var); 
function(); 
} 

我正在回以下:

# ./memory_segments 
global_initialized_var is at address 0x0804a018 
static_initialized_var is at address 0x0804a01c 

static_var is at address 0x0804a028 
global_var is at address 0x0804a02c 
heap_var is at address 0x09285008 

stack_var is at address 0xbf809fbc 
The function's stack_var is at address 0xbf809f8c 

据推测,所述第一2个变量因为它们初始化为静态,全局应该在.data段中,其他static_var和global_var应该位于.bss段中。我得到的地址我认为暗示它们都在同一个内存区域。我会做一个盲目的猜测,我会说这是.bss段。

无论如何,问题是以下,我是吗?如果我是怎么可能找出这些区域(bss,数据等)的“限制”或从哪里开始等等。

+1

两个挑剔 - 不要施放malloc()的结果http://stackoverflow.com/a/605858/2113226。并记住'免费(heap_var_ptr)' –

+0

你是非常正确的轨道上。 –

回答

1

假设你正在编译类似gcc memaddr.c -g -o memaddr之类的东西,你可以使用objdump -h以显示部分的大小和地址:

 
$ objdump -h memaddr | grep -e 'Size' -e '\.data' -e '\.bss' 
Idx Name   Size  VMA    LMA    File off Algn 
23 .data   00000018 0000000000601018 0000000000601018 00001018 2**3 
24 .bss   00000018 0000000000601030 0000000000601030 00001030 2**3 
$ 

您也可以使用objdump -t来显示你的符号属于地址和部分:

 
$ objdump -t memaddr | grep "_var" 
000000000060102c l  O .data 0000000000000004    static_initialized_var.2049 
0000000000601040 l  O .bss 0000000000000004    static_var.2050 
0000000000601044 g  O .bss 0000000000000004    global_var 
0000000000601028 g  O .data 0000000000000004    global_initialized_var 
$ 

因此,我们可以看到。数据和。 BSS部分相当小,恰好彼此相邻,所以.data和.bss地址非常接近并不奇怪。