為什麼使用動態記憶體分配
當你宣告陣列時,你必須用乙個編譯時常量指定的陣列的長度。但是,陣列的長度常常在執行時才知道,這是由於它所需要的記憶體空間取決於輸入資料。例如,乙個用於計算學生等級和平均分的程式可能需要儲存乙個班級所有學生的資料,但不同班級的學生數量可能不同。在這些情況下,我們通常採用的方法是宣告乙個較大的陣列,它可以容納可能出現的最多元素。但這種方法的缺點明顯,這時候就需要動態開闢了。
malloc 和 free
void* malloc(size_t size);
這個函式向記憶體申請一塊連續可用的空間,並返回指向這塊空間的指標。
如果開闢成功,則返回乙個指向開闢好空間的指標。
如果開闢失敗,則返回乙個null指標,因此malloc的返回值一定要做檢查。
返回值的型別是 void* ,所以malloc函式並不知道開闢空間的型別,具體在使用的時候使用者自己來決定。
如果引數 size 為0,malloc的行為是標準是未定義的,取決於編譯器。
void free(void* pointer);
free函式用來釋放動態開闢的記憶體。
如果引數 ptr 指向的空間不是動態開闢的,那free函式的行為是未定義的。
如果引數 ptr 是null指標,則函式什麼事都不做。
calloc 和 realloc
void* calloc(size_t num, size_t size);
其功能是為num大小的size的元素開闢一塊空間,並且把空間的每個位元組初始化為0。
與函式 malloc 的區別只在於 calloc 會在返回位址之前把申請的空間的每個位元組初始化為全0。
void realloc(void *ptr, size_t size);
ptr 是要調整的記憶體大小,size 調整之後的大小。
用於修改乙個原先已經分配的記憶體塊的大小,可以是一塊記憶體擴大或縮小。
常見的動態記憶體錯誤
1.對null指標進行解引用操作。
2.對動態開闢空間的越界訪問。
3.對非動態開闢記憶體使用free釋放。
4.使用free釋放動態開闢記憶體的一部分。
5.對同一塊動態記憶體多次釋放。
6.動態開闢記憶體忘記釋放(記憶體洩漏)。
柔性陣列
c99 中,結構中的最後乙個元素允許是未知大小的陣列,叫做柔性陣列成員。
柔性陣列的特點:
1.結構中的柔性陣列成員前面必須至少乙個其他成員。
2.sizeof 返回的這種結構大小不包括柔性陣列的記憶體。
3.包含柔性陣列成員的結構用malloc ()函式進行記憶體的動態分配,並且分配的記憶體應該大於結構的大小,以適應柔性陣列的預期大小。
動態記憶體管理
首先應該明白物件的三種內部的儲存方式 自動儲存,靜態儲存,和動態儲存。當執行離開當期程式塊的時候,堆疊指標返回到它進入程式塊 之前的地方,有效的銷毀了那個程式塊的自動變數。重新進入這個塊會再次建立所有的自動變數。靜態物件宣告或者在檔案域中。動態物件是存在系統呼叫 的在執行期中建立並且儲存在堆中,這是...
動態 記憶體管理
定義變數時,必須制定其資料型別和名字。而動態建立物件時,只需指定其資料型別,而不必為該物件命名。取而代之的是,new表示式返回指向新建立物件的指標,我們通過該指標來訪問此物件。int i int pi new int 這個new表示式在自由儲存區中分配建立了乙個整型物件,並返回此物件的位址,並用該位...
動態記憶體管理
c語言使用malloc calloc realloc free進行動態記憶體管理。void test c 通過new和delete動態管理記憶體。new delete動態管理物件。new delete動態管理物件陣列。void test void test int globalvar 1 stati...