在本教程中,您將學習使用標準庫函數(shù):malloc(),calloc(),free()和realloc()在C語言程序中動態(tài)分配內(nèi)存。
如您所知,數(shù)組是固定數(shù)量的值的集合。聲明數(shù)組的大小后,您將無法更改它。
有時,您聲明的數(shù)組的大小可能不足。要解決此問題,可以在運行時手動分配內(nèi)存。這在C語言編程中稱為動態(tài)內(nèi)存分配。
可以使用標準庫函數(shù)malloc(),calloc(),realloc()和free(),進行動態(tài)分配內(nèi)存。這些函數(shù)在<stdlib.h>頭文件中定義。
名稱“ malloc”表示內(nèi)存分配。
malloc()函數(shù)保留一個指定字節(jié)數(shù)的內(nèi)存塊。 并且,它返回一個void指針,可以將其轉(zhuǎn)換為任何形式的指針。
ptr = (castType*) malloc(size);
示例
ptr = (float*) malloc(100 * sizeof(float));
上面的語句分配了400字節(jié)的內(nèi)存。因為浮點數(shù)的大小是4字節(jié)。并且,指針ptr保存分配內(nèi)存中的第一個字節(jié)的地址。
如果無法分配內(nèi)存,則表達式將產(chǎn)生NULL指針。
名稱“ calloc”表示連續(xù)分配。
malloc()函數(shù)分配內(nèi)存,并保留未初始化的內(nèi)存。 而calloc()函數(shù)分配內(nèi)存并將所有位初始化為零。
ptr = (castType*)calloc(n, size);
示例:
ptr = (float*) calloc(25, sizeof(float));
上面的語句在內(nèi)存中為25個float類型的元素分配連續(xù)空間。
使用calloc()或malloc()動態(tài)分配的內(nèi)存不會自己釋放。必須顯式地使用free()來釋放空間。
free(ptr);
該語句釋放由ptr指向的內(nèi)存中分配的空間。
//程序來計算用戶輸入的n個數(shù)字的總和
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, i, *ptr, sum = 0;
printf("輸入元素數(shù)量: ");
scanf("%d", &n);
ptr = (int*) malloc(n * sizeof(int));
// 如果無法分配內(nèi)存
if(ptr == NULL)
{
printf("錯誤! 內(nèi)存未分配。");
exit(0);
}
printf("輸入元素: ");
for(i = 0; i < n; ++i)
{
scanf("%d", ptr + i);
sum += *(ptr + i);
}
printf("Sum = %d", sum);
//釋放內(nèi)存
free(ptr);
return 0;
}在這里,我們?yōu)閚個int動態(tài)分配了內(nèi)存。
//程序來計算用戶輸入的n個數(shù)字的總和
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, i, *ptr, sum = 0;
printf("輸入元素數(shù)量: ");
scanf("%d", &n);
ptr = (int*) calloc(n, sizeof(int));
if(ptr == NULL)
{
printf("錯誤! 內(nèi)存未分配。");
exit(0);
}
printf("輸入元素: ");
for(i = 0; i < n; ++i)
{
scanf("%d", ptr + i);
sum += *(ptr + i);
}
printf("Sum = %d", sum);
free(ptr);
return 0;
}如果動態(tài)分配的內(nèi)存不足或超過所需,可以使用realloc()函數(shù)更改以前分配的內(nèi)存的大小。
ptr = realloc(ptr, x);
在這里,ptr被重新分配為新的大小x。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *ptr, i, n1, n2;
printf("輸入大小: ");
scanf("%d", &n1);
ptr = (int*)malloc(n1 * sizeof(int));
printf("先前分配的內(nèi)存地址: ");
for (i = 0; i < n1; ++i)
printf("%u\n", ptr + i);
printf("\n輸入新的大小: ");
scanf("%d", &n2);
//重新分配內(nèi)存
ptr = realloc(ptr, n2 * sizeof(int));
printf("新分配的內(nèi)存地址: ");
for (i = 0; i < n2; ++i)
printf("%u\n", ptr + i);
free(ptr);
return 0;
}運行該程序時,輸出為:
輸入大小: 3 先前分配的內(nèi)存地址: 7452312 7452316 7452320 輸入新的大小: 5 新分配的內(nèi)存地址: 7452312 7452316 7452320 7452324 7452328