关于c语言的变量存储及内存分配

本文深入探讨计算机内存的使用,解释内存如何在程序运行过程中进行分配,并阐述内存中的不同段及其作用,包括代码段、数据段、堆和栈的详细说明,以及全局变量与局部变量的存储区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在计算机里面,cpu与磁盘(硬盘)是不直接发生数据交换的,因为cpu处理数据的速度远大于磁盘的速度,因此,在cpu与磁盘之间就有了内存这东西的出现,内存就是起着一个缓冲的作用,当运行程序的时候,首先的从磁盘把程序加载到内存,然后cpu才能从内存里面取指令以及传输数据。但是内存是掉电之后里面的数据就会丢失,而磁盘里面的数据会一直存在的,因此,当你关机之后,内存就会被清空,下次开机的时候重将系统程序从磁盘加载到内存,然后再执行。这种每次断电之后开机都会重新从磁盘加载系统程序到内存的方法明显影响了开机的速度,因此现在人们想出了一种办法在断电之后仍能保证内存的数据不会丢失的办法,那就是断电之后仍然给内存供极少的电量来保证内存的数据不会丢失,着就是所谓的低功耗。当下次打开电脑的时候,系统加载会很快。


刚才说了内存在程序运行过程中不可缺少,下面来看看编译器都是怎么来把整个内存进行分配的。

我们编写的c语言源代码(文本文件或者叫ASCII文件)必须要转换成机器所能识别的二进制文件,计算机才能进行运算,因此,源码先经过汇编->编译之后形成二进制文件,然后是将编译器提供的各个二进制源代码连接起来形成一个整体的二进制文件。

、在上诉过程中编译器会在内存中分出几个段,分别是:

代码段:代码段用来存储加载到内存的二进制代码。cpu从里面取指令。

数据段:数据段细分为三段:

1、已初始化读写数据段:主要存放声明并有初值的全局变量和加了static关键字的局部变量,它们的值都是可以改变的。

2、未初始化数据段BSS:主要存放的是未初始化的全局变量和加了static关键字的未初始化局部变量。

3、只读数据段:该数据段主要是存储程序中的常量数据(内容是不能改变的),一般所称的常量区就是指该数据段。


变量或者常量在上诉几个内存段中分配好之后,在整个程序运行过程中都有效,生命周期从建立到整个程序运行结束才释放,我们称之为静态存储区


初始化完成之后程序应该要执行了,在执行的过程中会在分出两个段:

:主要是提供给程序猿用malloc()函数动态分配需要的内存大小的。

:主要是分配函数里面的未加static关键字的局部变量和函数的行参的。


这两个段是在程序运行的过程中动态分配的,当调用函数的时候为其行参和未加static的局部变量分配内存,当函数调用结束内存释放,我们称为动态存储区


注明:全局变量加关键字static只是影响该变量的作用域,加上了就只能在该文本文件里面用,而不能在其他文件里面使用该变量。不会影响存储位置,有无关键字都是存储在静态存储区里面的。但是局部变量若加了static则会将该变量存储在静态存储区里面,不加应该是在动态存储区栈里面的,只是影响存储位置不会影响作用域



补充:全局变量是在编译的过程中就在静态存储区里面分配内存的,而局部变量则是在程序运行过程中动态分配内存的。


内存分配实例:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

moxi_wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值