data/bss/heap 和 stack 中的内存分配

Posted

技术标签:

【中文标题】data/bss/heap 和 stack 中的内存分配【英文标题】:memory allocation in data/bss/heap and stack 【发布时间】:2013-12-22 20:55:53 【问题描述】:

我有以下代码:

#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 段中,而其他 2 个 static_var 和 global_var 应该在 .bss 段中。我认为我得到的地址意味着它们都在同一个内存区域中。我会盲目猜测,我会说这是 .bss 段。

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

【问题讨论】:

两个挑剔 - 不要投射 malloc() ***.com/a/605858/2113226 的结果。并记得free(heap_var_ptr) 你在正确的轨道上。 【参考方案1】:

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

$ objdump -h memaddr | grep -e '大小' -e '\.data' -e '\.bss' Idx 名称大小 VMA LMA 文件关闭 Algn 23 .数据 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 地址如此接近也就不足为奇了。

【讨论】:

以上是关于data/bss/heap 和 stack 中的内存分配的主要内容,如果未能解决你的问题,请参考以下文章

程序存储器分段

各类变量生存周期及存储空间

colormap中的内嵌彩色模块和调用方式

dartlang中的内宽?

sql中的内连接和外连接

选择连接SQL语句中的内连接和where之间的区别[重复]