C 記憶體管理

2021-08-31 16:14:27 字數 2053 閱讀 3972

本文講解的是c 中的動態記憶體管理。c 語言為記憶體的分配和管理提供了幾個函式。這些函式可以在標頭檔案中找到。

序號函式和描述

1void *calloc(int num, int size);

在記憶體中動態地分配 num 個長度為 size 的連續空間,並將每乙個位元組都初始化為 0。所以它的結果是分配了 num*size 個位元組長度的記憶體空間,並且每個位元組的值都是0。

2void free(void *address);

該函式釋放 address 所指向的記憶體塊,釋放的是動態分配的記憶體空間。

3void *malloc(int num);

在堆區分配一塊指定大小的記憶體空間,用來存放資料。這塊記憶體空間在函式執行完成後不會被初始化,它們的值是未知的。

4void *realloc(void *address, int newsize);

該函式重新分配記憶體,把記憶體擴充套件到newsize

注意:void * 型別表示未確定型別的指標。c、c++ 規定 void * 型別可以通過型別轉換強制轉換為任何其它型別的指標。

程式設計時,如果預先知道陣列的大小,那麼定義陣列時就比較容易。例如,乙個儲存人名的陣列,它最多容納 100 個字元,所以您可以定義陣列,如下所示:

char name[100];
但是,如果預先不知道需要儲存的文字長度,例如向儲存有關乙個主題的詳細描述。在這裡,需要定義乙個指標,該指標指向未定義所需記憶體大小的字元,後續再根據需求來分配記憶體,如下所示:

#include #include #include int main()

else

printf("name = %s\n", name );

printf("description: %s\n", description );

}

當上面的**被編譯和執行時,它會產生下列結果:

name = zara ali

description: zara ali a dps student in class 10th

上面的程式也可以使用calloc()來編寫,只需要把 malloc 替換為 calloc 即可,如下所示:

calloc(200, sizeof(char));
當動態分配記憶體時,有完全控制權,可以傳遞任何大小的值。而那些預先定義了大小的陣列,一旦定義則無法改變大小。

當程式退出時,作業系統會自動釋放所有分配給程式的記憶體,但是,建議在不需要記憶體時,都應該呼叫函式free()來釋放記憶體。

或者,可以通過呼叫函式realloc()來增加或減少已分配的記憶體塊的大小。接下來使用 realloc() 和 free() 函式,再次檢視上面的例項:

#include #include #include int main()

else

/* 假設您想要儲存更大的描述資訊 */

description = realloc( description, 100 * sizeof(char) );

if( description == null )

else

printf("name = %s\n", name );

printf("description: %s\n", description );

/* 使用 free() 函式釋放記憶體 */

free(description);

}

當上面的**被編譯和執行時,它會產生下列結果:

name = zara ali

description: zara ali a dps student.she is in class 10th

您可以嘗試一下不重新分配額外的記憶體,strcat() 函式會生成乙個錯誤,因為儲存 description 時可用的記憶體不足。

C 記憶體管理 C 記憶體分類

c 記憶體管理 記憶體分類 moakap 在編寫程式過程中,程式設計師必須清楚程式記憶體的分配機制,合理進行記憶體管理,這樣才能得到高效的程式。同時,如果對c 記憶體分配基本概念不理解,使用不當,一方面浪費了寶貴的記憶體資源,降低了程式執行效率,另一方面還會造成程式中意想不到的錯誤。在 c 程式中,...

C 記憶體管理

在嵌入式系統中使用c 的乙個常見問題是記憶體分配,即對new 和 delete 操作符的失控。具有諷刺意味的是,問題的根源卻是c 對記憶體的管理非常的容易而且安全。具體地說,當乙個物件被消除時,它的析構函式能夠安全的釋放所分配的記憶體。這當然是個好事情,但是這種使用的簡單性使得程式設計師們過度使用n...

c 記憶體管理

這裡對我暫時所了解的記憶體機制做個記錄,以後再補。首先是記憶體分配 記憶體主要分為3個部分 一是從靜態儲存區域分配。編譯時分配好,主要存放全域性變數,static變數,程式結束釋放。二是從堆疊區域分配。函式內區域性變數存放的地方。隨變數生命週期自動釋放。效率較高,但大小有限。三是從記憶體池分配,即從...