選單
×
   ❮   
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

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() 函式

示例

釋放已分配的記憶體

// 釋放已分配的記憶體
free(ptr1);
自己動手試一試 »

您將在下一章中瞭解更多關於如何釋放已分配記憶體以及為什麼這很重要的資訊。



×

聯絡銷售

如果您想將 W3Schools 服務用於教育機構、團隊或企業,請傳送電子郵件給我們
sales@w3schools.com

報告錯誤

如果您想報告錯誤,或想提出建議,請傳送電子郵件給我們
help@w3schools.com

W3Schools 經過最佳化,旨在方便學習和培訓。示例可能經過簡化,以提高閱讀和學習體驗。教程、參考資料和示例會不斷審查,以避免錯誤,但我們無法保證所有內容的完全正確性。使用 W3Schools 即表示您已閱讀並接受我們的使用條款Cookie 和隱私政策

版權所有 1999-2024 Refsnes Data。保留所有權利。W3Schools 由 W3.CSS 提供支援