分配記憶

標準分配

C 動態記憶體分配函式在 <stdlib.h> 頭中定義。如果希望動態地為物件分配記憶體空間,可以使用以下程式碼:

int *p = malloc(10 * sizeof *p);
if (p == NULL) 
{
    perror("malloc() failed");
    return -1;
}

這計算了 10 個 ints 在記憶體中佔用的位元組數,然後從 malloc 請求許多位元組並將結果(即,使用 malloc 建立的記憶體塊的起始地址)分配給名為 p 的指標。

優良作法是使用 sizeof 來計算要請求的記憶體量,因為 sizeof 的結果是實現定義的(除了字元型別charsigned charunsigned char,其中 sizeof 被定義為始終給出 1)。

因為 malloc 可能無法為請求提供服務,所以它可能會返回空指標。檢查此項以防止以後嘗試取消引用空指標非常重要

使用 malloc() 動態分配的記憶體可以使用 realloc() 調整大小,或者在不再需要時使用 free() 釋放。

或者,宣告 int array[10]; 將分配相同數量的記憶體。但是,如果在沒有關鍵字 static 的函式內宣告它,它只能在它宣告的函式和它呼叫的函式中使用(因為陣列將在堆疊上分配,並且空間將被釋放以便重用時函式返回)。或者,如果在函式內部使用 static 定義它,或者如果它在任何函式之外定義,則其生命週期是程式的生命週期。指標也可以從函式返回,但 C 中的函式不能返回陣列。

歸零記憶體

malloc 返回的記憶體可能無法初始化為合理的值,應注意使用 memset 將記憶體歸零或立即將合適的值複製到其中。或者,calloc 返回所需大小的塊,其中所有位都初始化為 0。這不必與浮點零或空指標常量的表示相同。

int *p = calloc(10, sizeof *p);
if (p == NULL) 
{
    perror("calloc() failed");
    return -1;
}

calloc 的說明: 大多數(常用)實現將優化效能 calloc(),所以這將是比呼叫 malloc(),然後 memset(),即使最終的效果是相同的。

對齊記憶

Version >= C11

C11 引入了一個新功能 aligned_alloc(),它使用給定的對齊方式分配空間。如果要分配的記憶體需要在某些邊界對齊,而 malloc()calloc() 無法滿足,則可以使用它。malloc()calloc() 函式分配適合任何物件型別的記憶體 (即對齊方式為 alignof(max_align_t))。但是通過 aligned_alloc() 可以要求更大的對齊。

/* Allocates 1024 bytes with 256 bytes alignment. */
char *ptr = aligned_alloc(256, 1024);
if (ptr) {
    perror("aligned_alloc()");
    return -1;
}
free(ptr);

C11 標準強加了兩個限制:1) 請求的大小 (第二個引數)必須是對齊 (第一個引數) 的整數倍,2) 對齊的值應該是實現支援的有效對齊。未能滿足其中任何一個會導致未定義的行為