1. 程式人生 > >C動態記憶體開闢函式總結

C動態記憶體開闢函式總結

malloc和free

void* malloc (size_t size);

malloc 函式向記憶體申請一塊連續的空間,並且返回指向這塊空間的地址。注意,malloc只負責動態開闢一段連續空間,並不負責這塊空間的初始化。

  • 如果開闢成功,返回一個指向開闢好空間的地址。
  • 如果開闢失敗,返回一個NULL指標,注意:malloc的返回值一定要走檢查。
  • malloc函式並不知道要開闢多大的空間,具體大小的要自己決定。
  • 如果引數size為0,malloc的行為是不確定的,取決於編譯器。
void free (void* ptr);

free函式是專門用來做動態開闢記憶體的釋放和回收。

  • 如果引數ptr 指向的空間不是動態開闢的,則free函式的行為是不確定的。
  • 如果引數ptr 是NULL,則函式什麼都不做。
int *arr[10] = { 0 };
    int *p =(int*) malloc(sizeof(int)*10);  //為指標p開40位元組的空間
    if (p != NULL)
    {
        for (int i = 0; i < 10; i++)
        {
            *(p+i) = 2;
        }
    }

    free(p);
    p = NULL;

這裡寫圖片描述

這裡寫圖片描述

注意:
動態記憶體開闢的空間一定要free。如果不free的話會出現記憶體洩漏問題。

calloc

void* calloc (size_t num, size_t size);
  • calloc函式是為num個大小為size的元素開闢一塊空間,並且把空間的每個位元組初始化為0。這是與malloc函式的一大區別。

    這裡寫圖片描述

realloc

有時我們會發現過去申請的空間太小了,或者太大了,為了合理的記憶體,需在原來的記憶體上調整大小,而realloc函式就能夠解決這一問題。

void* realloc (void* ptr, size_t size);
  • ptr是要調整的記憶體地址
  • size是調整之後的新大小
  • 返回值為調整之後的記憶體起始地址
  • 這個函式調整原記憶體空間大小的基礎上,還會將原來記憶體中的資料挪到新的空間。

用realloc函式共有2種情況:

  1. 原來空間之後有足夠大的空間,這時候要擴充套件的記憶體就直接在原有記憶體之後直接追加,原來空間的資料不發生變化。

    這裡寫圖片描述

  2. 原有記憶體之後沒有足夠大的空間,這時候在堆空間上另外找一塊合適大小的連續空間,將原來記憶體的資料也拷到新記憶體中,這樣函式返回一個新的記憶體地址。
    這裡寫圖片描述