動態內存函數

當我們需要需要內存時,通常的開闢方法開闢的空間大小是提前設定好的的,如果要使用的空間大小在程序運行時才能知道,就要選擇動態內存開闢了。
動態內存函數有malloc, calloc, realloc, free。
前三個函數是開闢或者改變空間的函數,free是釋放內存的函數。
如果內存使用完沒有用free釋放掉,就會出現內存泄漏問題。
內存泄漏是指這樣一種場景:程序分配了一塊內存,但已經不再持有引用這塊內存的對象(通是指指針),內存泄漏可能會導致系統響應速度變慢,進城佔用的資源太多而被操作系統殺掉。所以申請的內存使用完後一定要將其free掉。
下面介紹如何動態開闢內存:
malloc:這個函數向內存申請一塊連續可用的空間,並返回指向這塊空間的指針,開闢成功後,返回一個指向開闢好空間的指針。開闢失敗,就返回一個NULL指針。
所以在使用指針時,一定要判斷指針是否爲NULL!
函數原型:
void* malloc (size_t size);
內存釋放和回收的函數free:
函數原型:
void free(void* ptr);
  如果參數ptr指向的空間不是動態內存開闢的,那free函數的行爲是未定義的。
  如果參數ptr是NULL指針,則函數什麼事都不做。
使用malloc和free函數時,要先聲明頭文件stdlib.h。
舉個例子來使用這些函數:

#include<stdio.h>
#include<windows.h>
#include <stdio.h>

#pragma warning(disable:4996)
int main()
{
    int num = 0;
    scanf("%d", &num);
    int* ptr = NULL;
    ptr = (int*)malloc(num * sizeof(int));
    if (NULL != ptr)//判斷ptr指針是否爲空
    {
        int i = 0;
        for (i = 0; i<num; i++)
        {
            *(ptr + i) = 0;
        }
    }
    free(ptr);//釋放ptr所指向的動態內存
    ptr = NULL;//如果不設置,ptr會成爲野指針(懸垂指針),指向內存中的任意位置
    return 0;
}

calloc
函數原型:void* calloc (size_t num, size_t size);
calloc函數與malloc的區別只有calloc會在返回地址之前把申請的空間的每個字節初始化爲全0,而malloc爲全cd。
舉個例子說明calloc的使用:

#include <stdio.h>
#include <stdlib.h>
int main()
{
 int *p = calloc(10, sizeof(int));
 if(NULL != p)
 {
 //使用空間
 }
 free(p);
 p = NULL;
 return 0;
} 

realloc
有時我們會發現開闢的空間太小了或者太大了,就要用到realloc函數對已開闢的空間大小做調整。
函數原型:
void* realloc (void* ptr, size_t size);
ptr是要調整的內存地址,size是調整之後新大小,返回值是調整之後的內存起始位置。

#include <stdlib.h>
#include <stdio.h>
int main()
{
    int *p = NULL;
    int *ptr = NULL;
    ptr = realloc(ptr, 1000);
    if (ptr != NULL)
    {
        p = ptr;
    }
    free(p);
    return 0;
}

以上就是動態內存函數的基本介紹,在使用中一定要注意:
 1.開闢內存後,使用ptr時要判斷是否爲NULL;
 2.使用完內存後,一定要用free函數釋放內存。
 3.不要重複用free釋放。

發佈了41 篇原創文章 · 獲贊 10 · 訪問量 5544
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章