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

标签 c memory-management

我有以下代码:

#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/

相关文章:

c++ - 修复此编译错误 : identifier "and" is a special operator name in C++ [-Werror=c++-compat]?

c - "error : invalid use of void expression"是什么?

C ArrayList 崩溃

class - 如何在 Fortran 2003 中以多态方式解除分配?

cocoa - 使用 NSGlyph 和内存分配

php - 在 PHP 中实现 C 的 atoi()

c - 枚举中的元素数

c - 有没有办法在不执行代码的情况下检查库是否是为小端或大端架构构建的?

ios - UICollectionView 中滚动或重新加载数据时出现内存泄漏问题

android - 运行 Android 内存不足