malloc() free() realloc()內存使用與釋放注意事項

1、頭文件:

#include "stdio.h"       
#include <stdlib.h>  //內存函數相關
#include <string.h>  //memset()  strcpy()函數相關

2、內存範例: 

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

struct __TEST
{
    int a;
    int b;
};

int main(void)
{
    __TEST *pArray;
    int n=1;
    int len=0;

    len = sizeof(__TEST );
    pArray= (__TEST *)malloc(len*n); //申請一個結構體內存
    memset(pArray,0,len);//內存初始化爲0
    //賦值
    pArray[0].a = 1;
    pArray[0].b = 1;
    
    pArray= (__TEST *)realloc(pArray,len*(n+1)); //增加一個結構體內存
    memset(pArray+len,0,len);//新增內存初始化爲0,內存偏移一個結構體單位
    printf("pArray[1].a=%d,pArray[1].b=%d\r\n",pArray[1].a,pArray[1].b);
    //賦值
    pArray[1].a = 2;
    pArray[1].b = 2;    

    for(n=0;n<2;n++)
    {
        printf("pArray[%d].a=%d,pArray[%d].b=%d\r\n",n,pArray[n].a,n,pArray[n].b);
    }
    free(pArray); //釋放內存

    pArray = NULL;
    return 0;
}

3、free() 是將此塊內存標誌位設爲未分配狀態,但內存數據並未改變,即之前寫在這塊內存上的數據沒變。

釋放內存後,下次程序重新分配內存時,會將此塊內存囊括其中進行計算,用於分配給其它線程使用

free()之後,指向此塊內存的指針pArray並未改變,依舊指向這塊內存。所以要將其設爲NULL。否則這塊內存重新分配後,操作pArray的代碼依舊可以改變這塊內存的數據。

後果就是新代碼寫入0,操作pArray的代碼又將其寫爲1。導致結果錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章