近來編寫幾個程式,很多都用到了數組。但是對于數組的大小卻是沒有固定的,也就是說可以更改數組大小,其大小是可以變化的。并不像初學時的那樣,告訴你一個範圍,你就必須取最大值以滿足要求。那樣可能就會浪費很多不必要的記憶體單元!那麼到底應該怎樣定義一個動态數組列?
http://blog.sina.com.cn/s/blog_5c50c7e20100d3gj.html
在數組一章中,曾介紹過數組的長度是預先定義好的, 在整個程式中固定不變。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函數申請的記憶體塊
}