1.環(huán)境表:
一個(gè)字符指針數(shù)組,其中每一個(gè)指針包含一個(gè)以NULL結(jié)束的C字符串地址。
全局變量environ包含了該指針數(shù)組的地址

image.png
2.C程序的存儲(chǔ)空間布局
-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.棧:自動(dòng)變量(局部變量)和函數(shù)調(diào)用時(shí)所需保存的信息
-5.堆:在堆中進(jìn)行動(dòng)態(tài)存儲(chǔ)的分配

image.png
需要存放在磁盤程序文件中的段只有正文段和初始化數(shù)據(jù)段
3.存儲(chǔ)空間分配
#include <stdlib.h>
void *malloc(size_t size); //分配指定字節(jié)數(shù)的存儲(chǔ)區(qū)。初值不確定
void *calloc(stize_t nobj, size_t size); //為指定長度的對(duì)象分配存儲(chǔ)空間,每一位bit 都初始化為0。
void *realloc(void *ptr, size_t newsize);//增加或減少以前分配區(qū)的長度。新增區(qū)域初值不確定
//在擴(kuò)充長度的時(shí)候,如果在存儲(chǔ)區(qū)后有足夠的空間,則直接向高位地址方向擴(kuò)充。否則會(huì)另外分配一個(gè)足夠大的存儲(chǔ)區(qū),將原本現(xiàn)存的數(shù)據(jù)拷貝過去,然后釋放原存儲(chǔ)區(qū),返回新的分配指針。
//成功都返回void*指針 否則返回NULL
大多數(shù)實(shí)現(xiàn)所分配的存儲(chǔ)空間要比所要求的稍微大一些,額外的空間用于記錄管理信息,比如:分配塊的長度,指向下一個(gè)分配塊的指針等。
函數(shù)alloca:他的調(diào)用魚malloc相同,但是它是在當(dāng)前函數(shù)的棧幀上分配存儲(chǔ)空間,不會(huì)發(fā)生泄露。但是缺點(diǎn)是增加了棧幀的長度。