1.環(huán)境表:
一個字符指針數(shù)組,其中每一個指針包含一個以NULL結(jié)束的C字符串地址。
全局變量environ包含了該指針數(shù)組的地址
2.C程序的存儲空間布局
-1正文段:由CPU執(zhí)行的機(jī)器指令部分幻妓×榱伲可共享济竹,只讀
-2初始化數(shù)據(jù)段:也叫數(shù)據(jù)段,包含了程序中年需明確地賦初值的變量比如:
int max = 99;
將此變量以其初值存放在初始化數(shù)據(jù)段中
-3.未初始化數(shù)據(jù)段:稱為bss(block started by symbol) 在程序開始之前碴开,內(nèi)核將此段中的數(shù)據(jù)初始化為0或空指針。
long sum[10000];
-4.棧:自動變量(局部變量)和函數(shù)調(diào)用時所需保存的信息
-5.堆:在堆中進(jìn)行動態(tài)存儲的分配
需要存放在磁盤程序文件中的段只有正文段和初始化數(shù)據(jù)段
3.存儲空間分配
#include <stdlib.h>
void *malloc(size_t size); //分配指定字節(jié)數(shù)的存儲區(qū)博秫。初值不確定
void *calloc(stize_t nobj, size_t size); //為指定長度的對象分配存儲空間潦牛,每一位bit 都初始化為0。
void *realloc(void *ptr, size_t newsize);//增加或減少以前分配區(qū)的長度挡育。新增區(qū)域初值不確定
//在擴(kuò)充長度的時候巴碗,如果在存儲區(qū)后有足夠的空間,則直接向高位地址方向擴(kuò)充即寒。否則會另外分配一個足夠大的存儲區(qū)橡淆,將原本現(xiàn)存的數(shù)據(jù)拷貝過去,然后釋放原存儲區(qū)蒿叠,返回新的分配指針明垢。
//成功都返回void*指針 否則返回NULL
大多數(shù)實(shí)現(xiàn)所分配的存儲空間要比所要求的稍微大一些,額外的空間用于記錄管理信息市咽,比如:分配塊的長度痊银,指向下一個分配塊的指針等。
函數(shù)alloca:他的調(diào)用魚malloc相同施绎,但是它是在當(dāng)前函數(shù)的棧幀上分配存儲空間溯革,不會發(fā)生泄露贞绳。但是缺點(diǎn)是增加了棧幀的長度。