打印
[应用相关]

C 语言内存分区详解并在 Ubuntu 和树莓派下验证

[复制链接]
楼主: 慢醇
手机看帖
扫描二维码
随时随地手机跟帖
21
慢醇|  楼主 | 2021-8-3 23:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
全局/静态存储区
和“栈”一样,通常是用于那些在编译期间就能确定存储大小的变量的存储区,但它用于的是在整个程序运行期间都可见的全局变量和静态变量。

使用特权

评论回复
22
慢醇|  楼主 | 2021-8-3 23:55 | 只看该作者
常量存储区
和“全局/静态存储区”一样,通常是用于那些在编译期间就能确定存储大小的常量的存储区,并且在程序运行期间,存储区内的常量是全局可见的。这是一块比较特殊的存储去,他们里面存放的是常量,不允许被修改。

使用特权

评论回复
23
慢醇|  楼主 | 2021-8-3 23:56 | 只看该作者

使用特权

评论回复
24
慢醇|  楼主 | 2021-8-3 23:57 | 只看该作者
三、进程在内存中的映射
main(…) ->; func_1(…) ->; func_2(…) ->; func_3(…),即:主函数main调用函数func_1; 函数func_1调用函数func_2; 函数func_2调用函数func_3。

使用特权

评论回复
25
慢醇|  楼主 | 2021-8-4 09:25 | 只看该作者
当一个程序被操作系统调入内存运行, 其对应的进程在内存中的映射如下图所示:

使用特权

评论回复
26
慢醇|  楼主 | 2021-8-4 09:26 | 只看该作者

使用特权

评论回复
27
慢醇|  楼主 | 2021-8-4 09:29 | 只看该作者
函数的栈帧——

使用特权

评论回复
28
慢醇|  楼主 | 2021-8-4 09:31 | 只看该作者
包含了函数的参数(至于被调用函数的参数是放在调用函数的栈帧还是被调用函数栈帧, 则依赖于不同系统的实现)。函数的栈帧中的局部变量以及恢复该函数的主调函数的栈帧(即前一个栈帧)所需要的数据, 包含了主调函数的下一条执行指令的地址。

使用特权

评论回复
29
慢醇|  楼主 | 2021-8-4 09:31 | 只看该作者
函数调用时所建立的栈帧包含下面的信息:

使用特权

评论回复
30
慢醇|  楼主 | 2021-8-4 09:32 | 只看该作者
1)函数的返回地址。返回地址是存放在主调函数的栈帧还是被调用函数的栈帧里,取决于不同系统的实现;

使用特权

评论回复
31
慢醇|  楼主 | 2021-8-4 09:33 | 只看该作者
2)主调函数的栈帧信息, 即栈顶和栈底;

使用特权

评论回复
32
慢醇|  楼主 | 2021-8-4 09:34 | 只看该作者
3)为函数的局部变量分配的栈空间;

使用特权

评论回复
33
慢醇|  楼主 | 2021-8-4 09:35 | 只看该作者
4)为被调用函数的参数分配的空间取决于不同系统的实现。

使用特权

评论回复
34
慢醇|  楼主 | 2021-8-4 09:36 | 只看该作者
未初始化数据区(BSS)——

使用特权

评论回复
35
慢醇|  楼主 | 2021-8-4 09:37 | 只看该作者
用于存放程序的静态变量,这部分内存都是被初始化为零的;而初始化数据区用于存放可执行文件里的初始化数据。这两个区统称为数据区。
注:并不给该段的数据分配空间,仅仅是记录了数据所需空间的大小。

使用特权

评论回复
36
慢醇|  楼主 | 2021-8-4 09:38 | 只看该作者
初始化数据区(Data)——

使用特权

评论回复
37
慢醇|  楼主 | 2021-8-4 09:38 | 只看该作者
注:为数据分配空间,数据保存在目标文件中。

使用特权

评论回复
38
慢醇|  楼主 | 2021-8-4 09:40 | 只看该作者
Text(代码区)——

使用特权

评论回复
39
慢醇|  楼主 | 2021-8-4 09:41 | 只看该作者
是个只读区,存放了程序的代码。任何尝试对该区的写操作会导致段违法出错。代码区是被多个运行该可执行文件的进程所共享的。

使用特权

评论回复
40
慢醇|  楼主 | 2021-8-4 09:42 | 只看该作者
注意:

随着函数调用层数的增加,函数栈帧是一块块地向内存低地址方向延伸的;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则