程序的内存从哪里来3
作者:互联网
程序的内存从哪里来3
学习过计算机的编译原理的同学都可能知道,编译器在编译程序的时候,会将程序的所有的元素分成各个组成部分,接下来我们将从代码段、数据段、和bss段更加深入的了解程序的内存。
代码段:代码段就是程序中的可执行部分,直观的了解代码段就是函数堆叠组成的。
数据段(也可以称为数据区、静态数据区、静态区):数据段就是程序中的数据,直观理解就是C语言程序中的全局变量。(值得注意的是:全局变量才算是数据段,局部变量不算程序的数据,只是算函数的数据)。
bss段(又叫ZI(zero initial)段):boss段的特点就是被初始化为0,bss段在本质上也属于数据段,bss段就是被初始化为0的数据段。
注意区分:数据段(.data)和bss段的区别和联系:二者在本质上没有什么区别,都是用来存放C语言的全局变量的。区别在于把显示初始化为非零的全景变量存在数据段(.data)断中,而把显示初始化为0或者并未初始化的全局变量存放在bss段中(C语言规定未被初始化的全局变量的初始值都是0)。
特殊:
1.有些一些特殊数据会被放到代码段,比如定义字符串时,字符串“LIUNX”实际上不是分配到数据段,而是分配到数据段,也就是说字符串实际是一个常量字符串而不是变量字符串
2.const型常量:C语言中const关键字用来定义常量,常量就是不能被改变的量。const的实现方法至少有2种:第一种就是编译器将const修饰的变量放在代码段去以实现不能修改(一般是单片机编译器);第二种就是用编译器来检查以确保const型的常量不会被修改,实际上const型的变量都是存放在数据段。
显示初始化为非零的全局变量和静态局部变量存放在数据段:
1.存放在数据段的变量有两种:第一种是显示初始化为非零的全局变量。第二种是静态局部变量,也就是static修饰的局部变量(普通的变量是分配在栈上面的,静态局部变量是分配在数据段上的)。
未初始化或者显示初始化为零的全局变量放在bss段:
1.bss段和数据段并没有什么本质的区别,几乎不用明确去区分。
总结:C语言中所有的变量和常量所使用的内存就以上三种。
1.相同点:三种获取内存的方法都可以给程序提供可用的内存,都可以用来定义变量给程序用。
2.栈内存对应C中的普通局部变量,其他的变量想用也用不了;而且栈内存是自动的,完全由编译器和系统决定,程序员不能决定;堆内存完全是由我们程序员控制,程序的内存可以通过malloc,使用完成后使用free释放;数据段对应C程序中的全局变量和静态局部变量。
不同方式的使用总结:
1.如果是函数内部零时使用,就定义局部变量
2.堆内存和数据段几乎拥有一样的属性,不同的是堆内存和数据段的生命周期是不一样的,堆内存的使用比全局变量的广泛。
标签:初始化,局部变量,程序,bss,哪里,内存,全局变量,数据 来源: https://www.cnblogs.com/qrs-tanmolin/p/15493230.html