程序在内存中的分布

大纲

对于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、编译链接

1
sudo gcc -g bss.c -o bss

4、查看

1
objdump -h bss | grep bss

.data

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

2、例子

3、编译链接

1
gcc -g data.c -o data

4、查看

1
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、编译链接

1
sudo gcc heap.c -o heap

4、查看

5、其他方式

1)calloc()函数

1
2
3
4
5
6
7
8
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()函数用来重新分配正在使用的一块内存大小。

1
2
3
4
5
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