曾经面试的初级必问题,再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