1.1 資料型別
// 對函式返回的限定
void fun(int a);
// 對函式引數的限定
int fun(void);
void a; // error,不能確定分配記憶體空間的大小
void * p; // ok, 萬能指標,指標型別都是4個位元組,函式引數,函式有返回值
//1. void* 可以指向任何型別的資料,被稱為萬能指標
void test03()
//2. void* 常用於資料型別的封裝
void test04()
sizeof
操作符注意事項
示例**:
//1. sizeof基本用法
void test01()
//2. sizeof 結果型別
void test02()
else
int b = 5;
if (sizeof(b) - 10
< 0)
else
}//3. sizeof 碰到陣列
void testarray(int arr)
void test03()
;printf("array size: %d\n",sizeof(arr));
//陣列名在某些情況下等價於指標
int* parr = arr;
printf("arr[2]:%d\n",parr[2]);
printf("array size: %d\n", sizeof(parr));
//陣列做函式函式引數,將退化為指標,在函式內部不再返回陣列大小
testarray(arr);
}
1.2 變數
1.2.1 變數的概念
既能讀又能寫的記憶體物件,稱為變數;
若一旦初始化後不能修改的物件則稱為常量。
變數定義的形式:型別 識別符號,識別符號,…,識別符號1.2.2 變數的本質
修改變數的兩種方式:
void test()
1.3 程式的記憶體四區模型
1.3.1 記憶體分割槽
總的來說,記憶體分割槽模型:
**區:可執行**段,不可修改。1.3.2 分割槽模型未初始化資料區(bss):全域性未初始化,靜態未初始化資料,資料的生存週期為整個程式執行過程 。
全域性初始化資料區/靜態資料區(data segment):全域性初始化,靜態初始化資料,文字常量(唯讀),資料的生存週期為整個程式執行過程。
棧區(stack):先進後出的記憶體結構,由編譯器自動分配釋放 ,存放函式的引數值、返回值、區域性變數等
堆區(heap):容量要遠遠大於棧,用於動態記憶體分配。堆在記憶體中位於bss區和棧區之間。一般由程式設計師分配和釋放,若程式設計師不釋放,程式結束時由作業系統**。
堆分配記憶體api:總結:void *calloc(size_t nmemb, size_t size);
/** 功能:
* 在記憶體動態儲存區中分配nmemb塊長度為size位元組的連續區域。calloc自動將分配的記憶體置0。
* 引數:
* nmemb:所需記憶體單元數量
* size:每個記憶體單元的大小(單位:位元組)
* 返回值:
* 失敗:null
*/
資料區包括:堆,棧,全域性/靜態儲存區。
全域性/靜態儲存區包括:常量區,全域性區、靜態區。
常量區包括:字串常量區、常變數區。
**區:存放程式編譯後的二進位制**,不可定址區。
可以說,c/c++記憶體分割槽其實只有兩個,即**區和資料區。
1.3.3 函式呼叫模型
1.3.4 棧的生長方向和記憶體存放方向
//1. 棧的生長方向
void test01()
//2. 記憶體生長方向(小端模式)
void test02()
c語言學習筆記之記憶體分割槽
c語言有五大記憶體分割槽,分別是棧,堆,全域性區,常量區,區。棧 在需要的時候由編譯器 系統 自動分配,在不需要的時候會由系統自動 的儲存區,記憶體由系統管理,函式中定義的變數儲存在棧中,當呼叫函式的時候函式中定義的變數會被加到棧中,當函式離開的時候,被新增的變數會從棧中移除,棧在最高的位址上,所以...
C 語言學習記錄 19 記憶體的分割槽模型
c 在執行時,將記憶體從大方向上劃分為四個區域,在這些不同區域中存放的資料,會被賦予不同的生命週期,以便我們靈活程式設計。1.區 由作業系統管理,用於存放函式體的二進位制 2.全域性區 用於存放全域性變數和靜態變數以及常量 3.棧區 由編譯器自動分配 釋放,存放函式的引數值和區域性變數等 4.堆區 ...
C語言記憶體分割槽
計算機的記憶體空間主要分為三個區 系統程式區 應用程式區和資料區 其中資料區又分為系統程式資料區和應用程式資料區兩類。大家在學習過程中編制的 c語言程式就屬於應用程式,程式 本身存放在程式區,而程式執行時所需變數的儲存空間則在應用程式資料區分配,該資料區又分為靜態資料區 堆疊區和堆區三種,程式執行時...