C和指標讀書筆記(第十一章)

2021-07-23 14:29:45 字數 2056 閱讀 4238

1.c函式庫提供了兩個函式:malloc和free,分別用於動態記憶體的分配和釋放。這些函式維護乙個可用記憶體池。當乙個程式需要一些記憶體時,它就呼叫malloc函式從記憶體池取一塊合適的記憶體,並向程式返回乙個指向這塊記憶體的指標。此時記憶體並未初始化。當一塊以親分配的記憶體不再使用時,程式呼叫free函式把他歸還給記憶體池共以後需要。

標頭檔案中宣告

void *malloc(size_t size);

void

free(void *pointer);

malloc的引數就是需要分配的記憶體位元組(字元)數,如果記憶體中的可用記憶體可以滿足這個要求,malloc就返回乙個指向被分配的記憶體塊起始位置的指標。如果記憶體池無法滿足請求,malloc會申請更多的記憶體,並在新申請的記憶體上分配任務,如果無法分配更多記憶體,malloc就返回乙個null指標。因此對每個從malloc返回的指標都必須檢查其值非null。

malloc返回*void指標,可以轉換成其他任何型別的指標。

2.另外兩個記憶體分配函式:calloc和realloc

void *calloc(size_t nu_ele. size_t ele_size);

//引數為「所需元素的數量」和「每個元素的位元組數」

void *realloc(void *ptr, size_t new_size);

calloc也用於分配記憶體,calloc在返回指向記憶體的指標之前把它初始化為0。

realloc函式用於修改乙個原先已經分配記憶體塊的大小。通過realloc可以是一塊記憶體擴大或縮小,如果擴大記憶體塊,那麼這塊 記憶體原先的內容依然保留,新增加的記憶體新增到原先記憶體塊的後面,新記憶體並未以任何方法初始化。如果縮小記憶體塊,該記憶體塊尾部的部分內容被拿掉,剩餘部分記憶體依然保留。

如果原先的部分無法改變大小,realloc將分配另一塊正確大小的記憶體大小,並將原先那塊記憶體的內容複製到新的塊上,因此在使用realloc後,就不能在使用指向舊記憶體的指標而是改用realloc所返回的新指標。

如果第乙個引數是null,那麼realloc和malloc的函式功能一樣

3.動態記憶體分配的常見錯誤:

4.動態分配記憶體的乙個常見用途就是為那些長度在執行時才知道的陣列分配記憶體空間。

#include

#include

//讀取、排列和列印一列整數值

//該函式由'qsort'呼叫,用於比較整型值

int compare_int(void

const *a, void

const *b)

int main()

//分配記憶體,用於儲存這些值

array = malloc(n_values * sizeof(int));

if(array == null)

//讀取這些值

for(i = 0; i < n_values; i += 1)

}//對這些值進行排序

qsort(array, n_values, sizeof(int), compare_int);

//列印這些值

for(i = 0; i < n_values; i += 1)

//釋放記憶體並退出

free(array);

return exit_success;

}

5.讀取字串時,如果預先不知道字串的長度,就無法使用普通陣列作為緩衝區,反之可以使用動態分配記憶體。當發現乙個長度超過緩衝區的輸入行就可以重新分配乙個更大的緩衝區,把該行的剩餘部分也裝進去。

#include 

#include

char *strdup(char

const *string);

int main(void)

//用動態分配記憶體製作字串的乙個拷貝,

char *strdup(char

const *string)

}

2016.10.11

第十一章 讀書筆記

第十一章 linux驅動程式中的 併發控制 併發 concurrency 指的是多個執行單元同時 並行被執行。而併發的執行單元對共享資 源 如硬體資摞 程式中的全域性變數 靜態變數等 的訪問很容易導致競態條件 race conditions 自旋鎖並不關心鎖定的 臨界區究竟是怎樣的操作,不管是讀還是...

第十一章讀書筆記

併發 concurrency 指的是多個執行單元同時 並行被執行。而併發的執行單元對共享資 源 如硬體資摞 程式中的全域性變數 靜態變數等 的訪問很容易導致競態條件 race conditions 例如,有乙個裝置檔案。程序 a 向該個裝置檔案寫入 1000 個 a飛而程序 b 向 裝置檔案寫入了 ...

讀書筆記 第十一章 C in depth

思考 11 2 from user in sampledata.allusers select user 轉譯 sampledata.allusers.select user user 範圍變數都可以是隱式型別。cast,oftype將飛型別化序列轉化為強型別。遇到不匹配型別,cast報錯,ofty...