C語言學習 記憶體分割槽

2021-08-21 13:16:27 字數 2551 閱讀 7708

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 記憶體分割槽

總的來說,記憶體分割槽模型:

**區:可執行**段,不可修改。

未初始化資料區(bss):全域性未初始化,靜態未初始化資料,資料的生存週期為整個程式執行過程 。

全域性初始化資料區/靜態資料區(data segment):全域性初始化,靜態初始化資料,文字常量(唯讀),資料的生存週期為整個程式執行過程。

棧區(stack):先進後出的記憶體結構,由編譯器自動分配釋放 ,存放函式的引數值、返回值、區域性變數等

堆區(heap):容量要遠遠大於棧,用於動態記憶體分配。堆在記憶體中位於bss區和棧區之間。一般由程式設計師分配和釋放,若程式設計師不釋放,程式結束時由作業系統**。

1.3.2 分割槽模型

堆分配記憶體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語言程式就屬於應用程式,程式 本身存放在程式區,而程式執行時所需變數的儲存空間則在應用程式資料區分配,該資料區又分為靜態資料區 堆疊區和堆區三種,程式執行時...