C 语言进程内存布局

===============================   博客点滴积累,部分话语和知识点来源于网络,感谢网络资源的提供者======


在嵌入式系统中,内存资源非常有限,只有熟悉代码在内存中的布局才可以更大限度地利用嵌入式内存资源。这篇文章主要分为两部分,首先贴图说明,进程内存布局,继而代码论证。

1 贴图


1)代码段(text 段  r):存放程序的全部二进制指令

2)data段(initialized data  r/rw):存放已经初始化的全局变量和已经初始化的static 局部变量,字符串常

量(r)

3)bss段(uninitialized data  rw):未初始化的全局变量和未初始化的static 局部变量,运行时初始化为0

4)堆段(heap):malloc 等函数动态分配,free 函数释放,如果不是释放,程序运行完,os自动释放。heap

地址向上生长。

5)栈段(stack):编译器自动分配释放,主要存局部变量,子函数,函数参数,使用完子函数就会自动释放,

当运行其他子函数,将覆盖已经释放的区域。stack 地址向下生长。

2 代码验证

#include<stdio.h>

char *text_p = "hello world !!!";  /* ro data */

int data_a =0;   /* data*/

int bss_b;         /* bss*/

void test(void) /* stack*/

{

static int data_c = 0;  /* data*/

static int bss_g;          /* bss*/

int stack_d = 0;         /*  stack*/

printf("data   address :&data_c =%p\r\n",&data_c);

printf("bss    address::&bss_g  =%p\r\n",&bss_g);

printf("stack  address :&stack_d=%p\r\n",&stack_d);

}

int main(void)

{

int stack_e; /*stack*/

char *heap_p = (char *)malloc(4);   /*heap*/

char *heap_pp = (char *)malloc(4);/*heap*/

printf("text   address :&main  =%p\r\n",&main);

printf("text   address :&text_p =%p\r\n",text_p);

printf("data   address :&data_a =%p\r\n",&data_a);

printf("bss    address::&bss_b  =%p\r\n",&bss_b);

test();

printf("stack  address :&stack_e=%p\r\n",&stack_e);

printf("stack  address :&test   =%p\r\n",&test);

printf("heap   address :&heap_p =%p\r\n",heap_p);

printf("heap   address :&heap_pp=%p\r\n",heap_pp);

return 0;

}

* 编译:root@yi-desktop:/home/yi# gcc 1127.c  -o 1127
1)size 命令看内存分布
2)readelf 命令看elf目标文件,命令详解可以看这篇文章: http://man.linuxde.net/readelf
root@yi-desktop:/home/yi#readelf 1127 -a    (显示所有信息)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值