C程序的存储空间布局

曾经面试的初级必问题,再mark一下

C程序一直由下列几部分组成:

  • 正文段(text),这是有cpu执行的机器指令部分,也是是从肉眼可见的代码编译出来的,也可以认为就是代码段。通常,正文段是可以共享的,所以即使频繁的执行一个程序,在存储器中也只需由一个副本,另外,正文段一般都是只读的。

  • 初始化数据段(data),通常称为数据段,它包含了在程序中需要明确赋值的变量,例如C程序中,任何在函数之外的变量的声明,这些变量以其初值存放在数据段中。

  • 未初始化数据段(bss),bss的名字来自于早期汇编程序一个操作符,意思是“由符号开始的块”(block started by symbol),在程序开始执行前,内核将此段中的数据初始化为0或空指针。比如,一个函数外对变量的声明,此变量会存放在bss段中。需要注意的是,程序并不会保证将该段完全初始化,可能只是分配指定长度的内存块供使用,可以手动赋值={0},或在代码中memset。

    long sum[1000]
  • 栈(stack)。1. 自动变量以及每次函数调用时所需保存的信息都存放在此段,比如函数中定义的变量,以及函数的返回值。2. 每次函数调用时,其返回地址以及调用者的环境信息(如某些机器寄存器的值)否保存在栈中。3. 最近被调用的函数,在栈上为其自动和临时变量分配存储空间。

  • 堆(heap),通常在堆中进行动态存储分配。堆位于未初始化数据段和栈之前。

典型的存储空间安排

上图显示了一种典型的存储空间安排。
对于一个可执行的程序,可以使用size命令来查看正文段、数据段和bss段的长度,以Byte为单位,第四和第五列分别以十进制和十六进制表示三段的总长度。

$ size time
   text    data     bss     dec     hex filename
   1886     608       8    2502     9c6 time
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值