关于程序运行时的数据结构

本文探讨了可执行文件中的数据段,包括文本段、数据段、BSS段和堆栈。初始化的全局变量和静态变量存放在数据段,未初始化的则在BSS。局部变量和函数参数存储在栈中,动态分配的内存位于堆中。只读数据段存放初始化数组和const变量。此外,还介绍了进程的地址空间,包括虚拟地址空间和共享库的影响,以及函数调用时堆栈的作用和过程活动记录的概念。

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

对于可执行文件,它包含了许多的段,例如(数据段,文本段,BSS段等),它们是二进制文件中简单的区域,里面保存了和某种特定类型(如符号表条目)相关的所有信息。

对于一个源文件,哪些地方会放到哪个段,如下图:
这里写图片描述

可得知,程序代码是存放在文本段,初始化的全局变量和静态变量是存放到数据段中的,而没有初始化的全局变量和静态变量则是存放到BSS,运行时所需要的BSS段的大小记录在目标文件中,但BSS段并不占据目标文件的任何空间,局部变量、临时数据、传递到函数中的参数则是存储于栈中,而通过函数调用malloc动态分配的内存则是在堆中。对于数组的初始化,初始化所用的数据则是放在只读数据段。const修饰的变量也是存放在只读数据段。

而对于一个可执行程序,它的段在内存分布(进程的地址空间)如下:
这里写图片描述

在上图中,注意虚拟地址空间的最低部分未被映射,它位于进程的地址空间内,但并未赋予物理地址,所以任何对它的引用都是非法的,该段空间用于捕捉使用空指针和小整型值的指针引用内存的情况。

通过编写程序加深理解:

#include <stdio.h>

#define AR
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值