1. 程式人生 > >c語言動態開闢記憶體

c語言動態開闢記憶體

要實現動態記憶體的分配,除了利用含指標成員的結構體之外,還需利用C語言提供的幾個標準庫函式。(使用時應包含標頭檔案“alloc.h”或“malloc.h”或“stdlib.h”)

    1.malloc函式

  函式原型為void *malloc(unsigned int size);在記憶體的動態儲存區中分配一塊長度為"size" 位元組的連續區域。函式的返回值為該區域的首地址。 “型別說明符”表示把該區域用於何種資料型別。(型別說明符*)表示把返回值強制轉換為該型別指標。“size”是一個無符號數。例如: pc=(char *) malloc (100); 表示分配100個位元組的記憶體空間,並強制轉換為字元陣列型別,函式的返回值為指向該字元陣列的指標, 把該指標賦予指標變數pc。若size超出可用空間,則返回空指標值NULL。

    2.calloc 函式

    函式原型為void *calloc(unsigned int num, unsigned int size)

  按所給資料個數和每個資料所佔位元組數開闢儲存空間。其中num為資料個數,size為每個資料所佔位元組數,故開闢的總位元組數為 num*size。函式返回該儲存區的起始地址。calloc函式與malloc 函式的區別僅在於一次可以分配n塊區域。例如: ps=(struct stu*) calloc(2,sizeof (struct stu)); 其中的sizeof(struct stu)是求stu的結構長度。因此該語句的意思是:按stu的長度分配2塊連續區域,強制轉換為stu型別,並把其首地址賦予指標變數ps。

    3. realloc函式:

  函式原型為void *realloc(void *ptr, unsigned int size)

      重新定義所開闢記憶體空間的大小。其中ptr所指的記憶體空間是用前述函式已開闢的,size為新的空間大小,其值可比原來大或小。函式返回新儲存區的起始地 址(該地址可能與以前的地址不同)。例如p1=(float *)realloc(p1,16);將原先開闢的8個位元組調整為16個位元組。

 **動態申請的記憶體空間要進行手動用free()函式釋放

例子:

             char *p;

             p=(char*)malloc(8);//開闢8個位元組的儲存空間,並把地址賦給指標p,通過指標p對該空間進行存取操作。

             *p='L';      //儲存字元,所分配空間的第0位元組儲存L

             *(p+1)='o';//分配空間的第一位元組儲存字元'o'.

             *(p+2)='v';

             *(p+3)='e';

             *(p+4)='\0';

           puts(p);//輸出字串

         free(p);//釋放空間

注意:*(p+n)等價於p[n],(p+n)是地址,而*(p+n)就是取地址(p+n)的內容。

如上面程式中的*(p+1)='A';可寫成p[1]='A';

malloc()函式的引數可以是常數、變數或表示式等。除了存放字串外,malloc()也可取得空間來儲存整數等資料。例如儲存整數分配空間如下:

int *ptr;

ptr=(int *)malloc(sizeof(int)*4);

malloc()開闢空間儲存4個整數資料,由於malloc()總傳回第0位元組的地址,且返回值必定是char*型別,所以要通過(int *)來強制轉換為指向整型後存入指向整型的指標ptr.

當用malloc()函式分配空間時,若計算機無法提供足夠的空間分配則會返回NULL指標。所以,若返回的指標為NULL,就表示可分配的剩餘空間已不足。


參考連結:

http://www.cnblogs.com/zhj202190/archive/2011/05/11/2043620.html

http://blog.ednchina.com/xiaoxiaopig/285368/Message.aspx