本篇原创作者: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。
1、作用:bss段用来存放没有被初始化和已经被初始化为0的全局变量
2、例子
3、编译链接
sudo gcc -g bss.c -o bss
4、查看
objdump -h bss | grep bss
1、作用:data段用来存放已经被初始化为非0的全局变量
2、例子
3、编译链接
gcc -g data.c -o data
4、查看
objdump -h data | grep \\.data
作用:rodata段用来存放常量数据、被编译器自动存放来的字符串和加 const
关键字的常量数据。
作用:text段用来存放代码和部分整数常量,该段是可执行的。
作用:1、stack存放函数的临时变量、局部变量、函数参数和返回值 2、由编译器自动分配和释放。
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