C 重新分配記憶體
重新分配記憶體
如果您預留的記憶體不足,可以對其進行*重新分配*以使其更大。
重新分配會預留不同(通常更大)數量的記憶體,同時保留其中儲存的資料。
您可以使用 realloc()
函式更改已分配記憶體的大小。
realloc()
函式接受兩個引數
int *ptr2 = realloc(ptr1, size);
- 第一個引數是指向正在調整大小的記憶體的指標。
- 第二個引數指定了已分配記憶體的新大小,以位元組為單位。
realloc()
函式嘗試調整 *ptr1* 處的記憶體大小並返回相同的記憶體地址。如果無法在當前地址調整記憶體大小,則會在不同地址分配記憶體並返回新地址。
注意:當 realloc()
返回不同的記憶體地址時,原始地址處的記憶體不再被預留且使用不安全。重新分配完成後,最好將新指標賦給之前的變數,以免意外使用舊指標。
示例
增加已分配記憶體的大小
int *ptr1, *ptr2, size;
// 為四個整數分配記憶體
size = 4 * sizeof(*ptr1);
ptr1 = malloc(size);
printf("%d bytes allocated at address %p \n", size, ptr1);
// 將記憶體大小調整為可容納六個整數
size = 6 * sizeof(*ptr1);
ptr2 = realloc(ptr1, size);
printf("%d bytes reallocated at address %p \n", size, ptr2);
自己動手試一試 »
空指標和錯誤檢查
如果 realloc()
函式無法分配更多記憶體,它將返回一個 NULL
指標。這種情況極不可能發生,但當您的程式碼需要萬無一失時,值得牢記。
以下示例透過檢查 NULL
指標來檢查 realloc()
是否能夠調整記憶體大小
示例
檢查空指標
int *ptr1, *ptr2;
// 分配記憶體
ptr1 = malloc(4);
// 嘗試調整記憶體大小
ptr2 = realloc(ptr1, 8);
// 檢查 realloc 是否能夠調整記憶體大小
if (ptr2 == NULL) {
// 如果重新分配失敗
printf("失敗。無法調整記憶體大小");
} else {
// 如果重新分配成功
printf("成功。在地址 %p 處重新分配了 8 位元組 \n", ptr2);
ptr1 = ptr2; // 將 ptr1 更新為指向新分配的記憶體
}
自己動手試一試 »
注意:在分配記憶體時,應始終包含錯誤檢查(如果 *指標* == NULL)。
注意:使用完已分配的記憶體後,應始終**釋放**或釋放它。這對於確保您的程式按預期執行很重要,但它也會使其更易於維護和高效。
要釋放記憶體,只需使用 free()
函式
您將在下一章中瞭解更多關於如何釋放已分配記憶體以及為什麼這很重要的資訊。