天天看點

C語言--動态記憶體管理

1 malloc--申請動态記憶體空間

—void *malloc(size_t size)

malloc函數向系統申請比對size個位元組的記憶體空間。并傳回一個指向這塊空間的指針

如果函數調用成功,傳回一個指針申請的記憶體空間的指針,由于傳回類型是void指針(void *),

是以他可以被轉換成任何類型的資料;如果函數調用失敗,傳回值是NULL。另外,

如果size的參數設定為0,傳回值也可能是NULL,但是這不是調用失敗。

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

int main()
{
    int ptr;
    
    ptr = (int *)malloc(sizeof(int));
    if(ptr == NULL)
    {
        printf("配置設定記憶體失敗\n");
        exit(1);
    }
    printf("請輸入一個整數:");
    scanf("%d",ptr);
    
    printf("你輸入的整數是:%d\n",*ptr);
    return 0;

}
           

2 free--釋放動動态記憶體空間

—void free(void *ptr);

free函數釋放ptr參數指向的記憶體空間。該記憶體空間必須是由malloc、callloc或realloc函數

申請的。否則,該函數将導緻未定義行為。如果ptr參數是NULL,則不執行任何操作。

注意:該函數并不會修改ptr參數的值,是以調用後,它仍然指向原來的地方。

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

int main()
{
    int ptr;
    
    ptr = (int *)malloc(sizeof(int));
    if(ptr == NULL)
    {
        printf("配置設定記憶體失敗\n");
        exit(1);
    }
    printf("請輸入一個整數:");
    scanf("%d",ptr);
    
    printf("你輸入的整數是:%d\n",*ptr);
    free(ptr);
    return 0;

}
           

3 calloc--申請并初始化一系列記憶體空間

void *calloc(size_t nmenb, size_t size);

calloc函數在記憶體中動态的申請nmemb個長度為size的連續記憶體空間

(即申請的總空間尺寸為nmeb *size),這些記憶體空間全部被初始化為0。

calloc函數在申請完之後,自動初始化該記憶體空間為0;

malloc函數不進行初始化操作,裡面的資料是随機的。

4 realloc--重新配置設定記憶體空間

void *realloc(void *ptr, size_t  size);

readlloc函數修改ptr指向的記憶體空間大小為size位元組

如果重新配置設定的記憶體空間比原來的大,則舊記憶體塊的資料不會發生改變;

如果新的記憶體空間比原來的小,可能會丢失資料。

memset:使用一個常量位元組填充記憶體空間

memcpy:拷貝記憶體空間

memmove:拷貝記憶體空間

mencmp:比較記憶體空間

memchr:在記憶體空間中搜尋一個字元