程序在内存中的分布

时间:2022-07-23
本文章向大家介绍程序在内存中的分布,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

本篇原创作者:Rj45

大纲

对于x86架构下的Linux程序,在被载入内存中会展开成如下情况:

1、对于x86 架构的系统来说,器虚拟空间为4GB. 2、高位的1GB为内核空间。3、低位的3GB由Text segment(ELF)、Data segment、Bss segment、Heap、Memory mapping Segment、stack。4、Memory mapping Segment存放Linux的动态链接库 5、对于stack来说,其最大值为8MB。

.bss

1、作用:bss段用来存放没有被初始化和已经被初始化为0的全局变量

2、例子

3、编译链接

sudo gcc -g bss.c -o bss

4、查看

objdump -h bss | grep bss

.data

1、作用:data段用来存放已经被初始化为非0的全局变量

2、例子

3、编译链接

gcc -g data.c -o data

4、查看

objdump -h data | grep \.data

.rodata

作用:rodata段用来存放常量数据、被编译器自动存放来的字符串和加 const关键字的常量数据。

.text

作用:text段用来存放代码和部分整数常量,该段是可执行的。

stack

作用:1、stack存放函数的临时变量、局部变量、函数参数和返回值 2、由编译器自动分配和释放。

heap

1、作用:heap用来动态分配内存,由程序员控制,交由程序自身决定开辟和释放。malloc&free calloc&realloc 2、例子 malloc&free

3、编译链接

sudo gcc heap.c -o heap

4、查看

5、其他方式

1)calloc()函数

void *calloc(size_t number,size_t size);

用法1
int *p = (int *)calloc(1024,sizeof(int));

用法2
int *p = (int *)malloc(1024*sizeof(int));
memset(p.0,1024*sizeof(int));

number表示要分配元素的个数、size表示每个元素的大小、分配的内存空间是numbersize、返回值为void类型的指针,指向分配号的内存首地址。2)realloc()函数 realloc()函数用来重新分配正在使用的一块内存大小。

void *realloc(void *ptr,size_t size);

int *p = (int *)malloc(1024);
p = (int *)realloc(512);// 重新分配为 512字节大小内存
p = (int *)realloc(2048);// 重新分配为2048字节大小内存

参考

https://www.cnblogs.com/hythink/p/5422602.html