天天看點

C語言中動态數組的實作

    近來編寫幾個程式,很多都用到了數組。但是對于數組的大小卻是沒有固定的,也就是說可以更改數組大小,其大小是可以變化的。并不像初學時的那樣,告訴你一個範圍,你就必須取最大值以滿足要求。那樣可能就會浪費很多不必要的記憶體單元!那麼到底應該怎樣定義一個動态數組列?

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函數申請的記憶體塊

}

繼續閱讀