有话先说
我们都知道,
一个程序是由代码和数据构成的。
其中代码是放在代码区,
而数据根据类型和功能 的不同,
又放在不同的区域。
那么关于这些区域是怎么划分的呢?
今天带你一探究竟。
01
代码区
顾名思义,
代码区就是存储程序代码的区域。
例如下面的程序:
像run()函数,
main()函数这些,
以及printf()这些可执行的代码
都是丢到了代码区。
值得注意的是代码区是只读的,
并不可写。
02
栈区
栈区是由编译器在需要的时候分配,
用完会自动清除的一个区域,
通常这个区域存放的是
一些局部变量以及函数的参数等,
栈区的大小一般由编译器决定,
效率比较高,
但空间比较有限。
例如下面的程序:
像其中func函数中的变量a,变量b,
main函数里面的变量val
等局部变量
以及调用func函数传入的参数200等,
这些都是存放在栈区的,
存入栈区的变量
会在代码块执行完之后清除。
同学们也可以思考一下:
为什么这里不断循环,
执行int a = 0;
但编译器没有提示重定义的错误。
而这个:
编译器会提示变量a重定义了
这里用栈自动清除的特性就很容易解释了,
定义在大括号里面的变量a
是一个局部变量,
for每循环一次,
就执行下面大括号里面的内容一次,
等执行完了整个大括号的内容,
栈自动清除局部变量a,
由于a已经被清除,
下一次循环时再定义a自然不会有问题。
而下面连续在同一代码块
定义多个同名变量,
编译器自然给你一个CE了。
03
堆区
前面说的,
栈区是放局部变量的区域,
大小有限。
那么实际开发中,
要从硬盘中加载一个几GB的大数据文件,
用到更多的内存空间时怎么办?
这时候你就可以用到堆区了!
堆区是由程序员手动申请的,
伴随整个程序运行周期都有效的,
一块内存区域。
堆区的释放编译器可不会管,
需要手动释放的。
如果没有释放掉,
那么只有程序结束时,
操作系统才会自动回收。
C语言中,
可以用malloc函数来申请堆区的内存。
例如下面的程序:
malo函数结束后,
通过malloc申请的100个字节的内存
并不会被回收,
这一块内存则是从堆区中申请的。
说到这里,
有些邪恶的小伙伴可能已经想到了,
可以来个死循环,
然后不断申请内存,
最终卡死电脑。
04
- 全局/静态存储区
这一块区域主要用来,
存储程序的静态变量以及全局变量,
它先于main函数之前分配。
是伴随整个程序的生命周期都存在的。
例如下面的例子:
值得一提的是,
字符串常量也是放在静态区的。
从这一点上来说,
我们又可以称字符串常量为无名的静态变量。
尾声
看了上面的介绍
是不是对内存区域的划分更加清楚了呢
是不是觉得自己的肚子里的墨水又多了呢
小编觉得答案毋庸置疑了>-<
那还等什么~
快点来关注并加入我们
增长自己的 姿势水平 吧~~~