分配記憶
標準分配
C 動態記憶體分配函式在 <stdlib.h>
頭中定義。如果希望動態地為物件分配記憶體空間,可以使用以下程式碼:
int *p = malloc(10 * sizeof *p);
if (p == NULL)
{
perror("malloc() failed");
return -1;
}
這計算了 10 個 int
s 在記憶體中佔用的位元組數,然後從 malloc
請求許多位元組並將結果(即,使用 malloc
建立的記憶體塊的起始地址)分配給名為 p
的指標。
優良作法是使用 sizeof
來計算要請求的記憶體量,因為 sizeof
的結果是實現定義的(除了字元型別,char
,signed char
和 unsigned 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) 對齊的值應該是實現支援的有效對齊。未能滿足其中任何一個會導致未定義的行為 。