ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

程序的内存从哪里来3

2021-11-01 22:01:13  阅读:192  来源: 互联网

标签:初始化 局部变量 程序 bss 哪里 内存 全局变量 数据


程序的内存从哪里来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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有