1. 程式人生 > >C語言的動態分配函式

C語言的動態分配函式

      動態分配函式的核心是malloc()和free()。每次呼叫malloc()時,均分配剩餘的記憶體的一部分;每次呼叫free()時,均向系統返還記憶體。被分配的空記憶體區中的記憶體叫做堆(heap)。動態分配函式的原型在<stdlib.h>中。

      標準C定義了4種動態分配函式,可以用於所有的編譯程式。它們是:calloc(),malloc(),free()和realloc()。

      (1)calloc

void *calloc(size_t num, size_t size);

      函式calloc()分配的記憶體量等於num*size,即calloc()為num個大小為size的陣列分配足夠記憶體。分配記憶體中的所有位被初始化為零。

      calloc()返回一個指標,指向分得區域的第一位元組。記憶體不足以滿足請求時,返回空指標。因此,使用返回指標前,必須先檢查它是否為空指標。

//返回指向動態分配的100個浮點數的指標
#include <stdlib.h>
#include <stdio.h>

float *get_mem()
{
    float *p;
    p=calloc(100,sizeof(float));
    if(!p){
        printf("Allocation Error\n");
        exit(1);
    }
    return p;
}

      (2)free

void free(void *ptr);
      函式free()向堆中返回ptr指向的記憶體,使記憶體可供將來再分配。

      呼叫free()的指標必須是先前用動態分配系統函式()malloc(),realloc()及calloc())之一所分配而取得的。用無效指標呼叫free()可能摧毀記憶體管理機制,使系統癱瘓。

      (3)malloc

void *malloc(size_t size);
      函式malloc()返回一個指標,指向從堆中分配的size位元組記憶體區的首位元組。堆中記憶體不足時,返回空指標。使用前,必須核實返回的指標不為空。否則將導致系統癱瘓。

      (4)realloc

void *realloc(void *ptr, size_t size);
      操作後會分配一個新塊,新塊包含著與舊塊(最大為傳入的長度,用size表示)相同的內容。指向新塊的指標被返回。新快和舊塊可以從同一地址開始。因此realloc()返回的指標可以與傳入ptr的指標相同。
      如果ptr是空指標,則realloc()僅分配size位元組的記憶體,併為其返回一個指標。

      如果記憶體不足,則返回空指標,且原塊不變。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
  char *p;

  //最初通過malloc()函式只分配17個位元組
  p = malloc(17);
  if(!p) {
    printf("Allocation Error\n");
    exit(1);
  }

  strcpy(p, "This is 16 chars");

  //通過realloc()函式將原記憶體擴大到18個位元組,多出的一個位元組用以存放句點
  p = realloc(p, 18);
  if(!p) {
    printf("Allocation Error\n");
    exit(1);
  }

  strcat(p, ".");

  printf(p);

  free(p);

  return 0;
}

執行結果: