C语言学习笔记 Day12(C8内存管理)

Day12 内容梳理:

目录

Chapter 8  内存管理

8.1 作用域(变量&函数)

(1)局部变量

(2)全局变量

(3)静态局部变量

(4)静态全局变量

(5)全局函数&静态函数

8.2 内存布局

(1)内存四区域


Chapter 8  内存管理

8.1 作用域(变量&函数)

C语言变量的作用域:

        代码块作用域(是{ }之间的代码)

        函数作用域

        文件作用域

        4种变量的辨析:

变量类型作用域生命周期存储区域
局部变量本函数内部局部变量创建到本函数结束栈区
全局变量项目中所有文件 程序创建到程序结束数据区
静态局部变量本函数内部 程序创建到程序结束数据区
静态全局变量本文件内部 程序创建到程序结束数据区

        2种函数的辨析:                              

函数类型作用域 生命周期存储位置
全局函数项目中所有文件从程序创建到程序销毁代码区
静态函数本文件内部从程序创建到程序销毁 代码区

另外,extern关键字被用于声明全局变量。

比如全局变量int a在其他文件中已经定义了,想在本文件中使用,需要在本文件中写:

extern int a;

(1)局部变量

定义:在函数内部定义的

作用域、 生命周期、存储区域均如上,就不再重复写了。

(2)全局变量

定义:在函数外部定义的

所有文件的全局变量都不可重名,但是局部变量可以和全局变量重名。

比如下面在“C7_指针”里定义了全局变量int a = 10;然后在“C8_内存管理”里先声明,再打印,运行正常。

(3)静态局部变量

静态局部变量只会初始化一次,可以多次赋值。

如果是普通的局部变量,由于形参无法改变实参(指针除外),所以5次运行的每一次都是从10开始加1,会打五个11,如下图:

而如果是静态局部变量(有static修饰),则只初始化一次,每一次加1都加上了,所以会打印11 12 13 14 15.,如图:

(4)静态全局变量

作用域、生命周期、存储区域参见上方的表格

未初始化的局部变量在visual studio中是不让使用的,会报错。

而对于全局变量、静态局部变量、静态全局变量,不初始化的话则能打印出0,如下图:

(5)全局函数 & 静态函数

全局函数

作用域、生命周期、存储区域参见表格。

注意:全局函数的名称是作用域中唯一的,不可有重复。

在C语言中,函数默认都是全局的,在其他文件中声明了之后就可以使用。

静态函数:

加上static关键字则可以将函数声明为静态的,其他文件无法用这个函数,即使声明了该函数也不管用。

不同文件中的static函数可以重名,毕竟除了定义的那个文件,其他文件用不了。

先在其他文件中定义一个静态函数:

然后在本文件中先声明再调用,报错如下,说明静态函数只能在本文件中使用:

8.2 内存布局

(1)内存四区域

代码区

程序执行二进制码(程序指令)

特点:共享、只读

数据区

加载的信息都是能和程序“同生共死”的。

包含:初始化数据区、未初始化数据区、常量区

栈区

系统为每个程序在栈区分配一个临时空间。

存储着:局部变量、函数信息、函数参数、数组

堆区

存储着:大数据、图片、音频文件、视频文件。

手动开辟:malloc函数

手动释放:free函数

代码区: “只读”是为了防止程序意外地修改了代码,从而导致调用出问题。

数据区:

①初始化数据区(也叫“静态数据区”或者data段):存的是已被初始化的全局变量、已被初始化的静态变量(静态全局变量&静态局部变量)、常量数据(比如字符串常量)

②未初始化数据区(bss区):存的是未初始化的全局变量、未初始化的静态变量。其中,本区域的数据在程序开始执行前会被初始化为0或者NULL。

③常量区:存常量。

栈区:由编译器自动分配和释放,在程序运行过程中实时加载和释放。

堆区:这个区域理论上没有空间限制,取决于你的内存大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值