代码段、数据段、bss段

(1)编译器在编译程序的时候,将程序中的所有的元素分成了一些组成部分,各部分构成一个段,所以说段是可执行程序的组成部分。

(2)代码段:代码段就是程序中的可执行部分,直观理解代码段就是函数堆叠组成的。

(3)数据段(也被称为数据区、静态数据区、静态区):数据段就是程序中的数据,直观理解就是C语言程序中的全局变量。(注意:全局变量才算是程序的数据,局部变量不算程序的数据,只能算是函数的数据)

(4)bss段(又叫ZI(zero initial)段):bss段的特点就是被初始化为0,bss段本质上也是属于数据段,bss段就是被初始化为0的数据段。 注意区分:数据段(.data)和bss段的区别和联系:二者本来没有本质区别,都是用来存放C程序中的全局变量的。区别在于把显示初始化为非零的全局变量存在.data段中,而把显式初始化为0或者并未显式初始化(C语言规定未显式初始化的全局变量值默认为0)的全局变量存在bss段。

有些特殊数据会被放到代码段

(1)C语言中使用char *p = "linux";定义字符串时,字符串"linux"实际被分配在代码段,也就是说这个"linux"字符串实际上是一个常量字符串而不是变量字符串。

(2)const型常量:C语言中const关键字用来定义常量,常量就是不能被改变的量。

const的实现方法至少有2种:

第一种就是编译将const修饰的变量放在代码段去以实现不能修改(普遍见于各种单片机的编译器);

第二种就是由编译器来检查以确保const型的常量不会被修改,实际上const型的常量还是和普通变量一样放在数据段的(gcc中就是这样实现的)。

显式初始化为非零的全局变量和静态局部变量放在数据段

(1)放在.data段的变量有2种:第一种是显式初始化为非零的全局变量。第二种是静态局部变量,也就是static修饰的局部变量。(普通局部变量分配在栈上,静态局部变量分配在.data段)

未初始化或显式初始化为0的全局变量放在bss段 (1)bss段和.data段并没有本质区别,几乎可以不用明确去区分这两种。

malloc address is =0x7826a2e000
value1:0x5c064a6008,valu2:0x5c064a6020,value3:0x5c064a4940,value4:0x5c064a4944,value5:0x5c064a6018,va6:0x5c064a601c,f:0x5c064a4848
local 0x7fd0c01c64


7fd0be2000-7fd0c03000 rw-p 00000000 00:00 0                              [stack]
栈 0x7fd0c01c64


7826a00000-7826e00000 rw-p 00000000 00:00 0                              [anon:libc_malloc]
堆             0x7826a2e000


5c064a6000-5c064a7000 rw-p 00001000 fe:00 2048003                        /data/local/tmp/mmap-test
全局未初始化变量 0x5c064a6020
全局静态变量     0x5c064a601c
局部静态变量     0x5c064a6018

全局初始化变量   0x5c064a6008

5c064a4000-5c064a5000 r-xp 00000000 fe:00 2048003                        /data/local/tmp/mmap-test
字符常量    0x5c064a4944
全局常量 0x5c064a4940
代码段: 0x5c064a4848

猜你喜欢

转载自blog.csdn.net/bin_linux96/article/details/83181685
今日推荐