随手笔记,bss,data,text,rodata,堆,栈
Bss段,为了方便记忆也称做零段 通常是用来存放
未初始化
或者初始化为0
的全局变量以及静态(static)变量两种情况。未初始化的值会将其初始化为0
.
值得说明的是bss类型的变量不占实际的磁盘空间`,只有在运行的时候占据内存空间。
Data段,也称为rw段,表示这片区域的数据即可以读也可以写。
存放的初始化的全局变量和静态(static)变量
,即占据文件大小空间也占据运行时候的内存空间,所以不易大量使用
的原因。
Rodata段,简称为ro段,表示这片区域的数据只能读,不能够写。存放的是常量数据(也就是
不能修改的数据
)。
例如以下三种情况
- #define a 10
- char * = “hello world”;
- const a =0
. text段,存放程序的
二进制代码
,即CPU执行的机器指令,并且是只读的。
head堆区,堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。使用
malloc new
申请空间 。free delete
释放空间。
- char* src= (char* )malloc(100);
- studeng* zhangsan =new student();
stack 栈区,存放
局部变量值 函数的参数
,也就是{}作用域内的。(不包块 static const),由编译器自动分配释放。
举个例子
#include <stdio.h>
define aa 1
int a=1;
int b;
main()
{
int c;
char *d=“123455”;
static int e=1;
char* f =(char* )malloc(100);
}
ro段有:aa d
data段有:a e
bss段有: b
栈区有:c
堆区有:f
常见考题
1
char* a;
char *d=“123455”;
strcpy(a,d);
错误,d只读,不能拷贝。
2
const char *arr ="123";
char* brr ="123";
const char crr[]="123";
char drr[]="123";
题目:以上四行代码的区别。
第一个和第二个一致,原本就保存在ro段,const本来就是修饰arr指向的值不能通过arr修改,但是“123”本来就在ro段,不能改变。所以效果一致。
第三个在ro段,第四个在栈上,但是编译器可能会做出某些优化,把其放在ro段上。
查看指令
编译链接
gcc test.c -o test
关注文件的大小
ls -l test
查看各个段的大小(stack 和 head段)
size test
查看段表存放了各个段的各种信息,比如段的名字、段的类型、段在elf文件中的偏移、段的大小等信息。
readelf -S test
类似功能
objdump -h