我有以下代码:
#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 个变量因为它们被初始化为 static 和 global 应该在 .data 段中,而其他 2 个 static_var 和 global_var 应该在 .bss 段中。我认为我得到的地址暗示它们都在同一个内存区域中。我会盲目猜测,我会说这是 .bss 段。
无论如何,问题如下,我说得对吗??如果我是,怎么可能找出这些区域(bss、数据等)的“限制”在哪里,或者它们从哪里开始等等。
最佳答案
假设您正在使用类似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 $
因此我们可以看到 .data 和 .bss 部分相当小并且恰好彼此相邻,因此 .data 和 .bss 地址如此接近也就不足为奇了。
关于c - data/bss/heap 和 stack 中的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20733973/