在數組壹章中,曾介紹過數組的長度是預先定義好的, 在整個程序中固定不變。C語言中不允許動態數組類型。例如: int n;scanf("%d",&n);int a[n]; 用變量表示長度,想對數組的大小作動態說明, 這是錯誤的。但是在實際的編程中,往往會發生這種情況, 即所需的內存空間取決於實際輸入的數據,而無法預先確定。對於這種問題, 用數組的辦法很難解決。為了解決上述問題,C語言提供了壹些內存管理函數,這些內存管理函數可以按需要動態地分配內存空間, 也可把不再使用的空間回收待用,為有效地利用內存資源提供了手段。 其它文獻中所提到的"動態數組",指的就是利用內存的申請和釋放函數,在程序的運行過程中,根據實際需要指定數組的大小.其本質是壹個指向數組的指針變量.常用的內存管理函數有以下三個:
1.分配內存空間函數malloc
調用形式: (類型說明符*) malloc (size) 功能:在內存的動態存儲區中分配壹塊長度為"size" 字節的連續區域。函數的返回值為該區域的首地址。 “類型說明符”表示把該區域用於何種數據類型。(類型說明符*)表示把返回值強制轉換為該類型指針。“size”是壹個無符號數。例如: pc=(char *) malloc (100); 表示分配100個字節的內存空間,並強制轉換為字符數組類型, 函數的返回值為指向該字符數組的指針, 把該指針賦予指針變量pc。
2.分配內存空間函數 calloc
calloc 也用於分配內存空間。調用形式: (類型說明符*)calloc(n,size) 功能:在內存動態存儲區中分配n塊長度為“size”字節的連續區域。函數的返回值為該區域的首地址。(類型說明符*)用於強制類型轉換。calloc函數與malloc 函數的區別僅在於壹次可以分配n塊區域。例如: ps=(struet stu*) calloc(2,sizeof (struct stu)); 其中的sizeof(struct stu)是求stu的結構長度。因此該語句的意思是:按stu的長度分配2塊連續區域,強制轉換為stu類型,並把其首地址賦予指針變量ps。
3.釋放內存空間函數free
調用形式: free(void*ptr); 功能:釋放ptr所指向的壹塊內存空間,ptr 是壹個任意類型的指針變量,它指向被釋放區域的首地址。被釋放區應是由malloc或calloc函數所分配的區域。
----------------------------------------------------------------------------------------------------------------------------------
// 程 式 名: DynamicArray.c
// 程式功能: 動態數組的實現
// 功能描述: 動態數組的創建與使用
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
void main()
{
int *array = 0, num, i;
printf("please input the number of element: ");
scanf("%d", &num);
// 申請動態數組使用的內存塊
array = (int *)malloc(sizeof(int)*num);
if (array == 0) // 內存申請失敗,提示退出
{
printf("out of memory,press any key to quit...\n");
exit(0); // 終止程序運行,返回操作系統
}
// 提示輸入num個數據
printf("please input %d elements: ", num);
for (i = 0; i < num; i++)
scanf("%d", &array[i]);
// 輸出剛輸入的num個數據
printf("%d elements are: \n", num);
for (i = 0; i < num; i++)
printf("%d,", array[i]);
printf("\b \n"); // 刪除最後壹個數字後的分隔符逗號
free(array); // 釋放由malloc函數申請的內存塊
}
望采納,謝謝