天天看點

C:15---動态記憶體管理(malloc、realloc、calloc、free)一、malloc()二、calloc()三、realloc()三、free()

  • 以下函數在#include<stdlib.h>中

一、malloc()

void *malloc(size_t size);
           
功能
  • 配置設定size大小位元組的記憶體空間
傳回值
  • 配置設定成功:傳回配置設定的記憶體空間的首位址
  • 配置設定失敗:傳回空指針
注意
  • 傳回的首位址指針類型是void*類型(因為malloc并不知道你申請的位址存放的是什麼類型的資料,是以傳回通用型指針void*),是以申請完記憶體之後需要強制類型轉換
  • 例如:以下ptd指針配置設定了20*8=160個位元組的空間,相當于大小為20個元素的double數組
double* ptd;
ptd=(double*)malloc(20*sizeof(double));
ptd[0]=3.14;
ptd[1]=2.35;
           

二、calloc()

void *calloc(size_t n, size_t size);
           
功能
  • 功能與malloc是相同的,都是申請記憶體空間
  • 但是比malloc多了一個功能,就是把申請的記憶體的所有位都初始化為0
參數
  • 參數1:申請多少個機關的記憶體空間
  • 參數2:每個機關多大
傳回值
  • 配置設定成功:傳回配置設定的記憶體空間的首位址(也是void*類型,需要強制類型轉換)
  • 配置設定失敗:傳回空指針
#include <stdio.h> 
#include <stdlib.h>
int main()  
{      
    int* arr=(int*)calloc(5,sizeof(int));
    for(int i=0;i<5;++i)
        printf("%d\t",arr[i]);
    printf("\n");
    free(arr);
    return 0; 
}
           
C:15---動态記憶體管理(malloc、realloc、calloc、free)一、malloc()二、calloc()三、realloc()三、free()

三、realloc()

void* realloc(void* ptr, unsigned newsize); 
           
功能
  • realloc是給一個已經申請了記憶體的指針重新配置設定記憶體
  • 即當一個指針指向的記憶體塊不夠或有多餘時可以使用realloc為其重新配置設定合适大小的記憶體
  • 如果參數2位NULL,那麼realloc()的功能就與malloc()的功能相同,用于配置設定一個指定長度的空間
參數
  • 參數1:原有的空間位址
  • 參數2:重新申請的位址空間位元組數
傳回值
  • 配置設定成功:傳回配置設定的記憶體空間的首位址(也是void*類型,需要強制類型轉換)
  • 配置設定失敗:傳回空指針
  • 案例
#include <stdio.h> 
#include <stdlib.h>
int main()  
{      
    int *p=(int*)malloc(sizeof(int)*3);
    p[0]=1;
    p[1]=2;
    p[2]=3;
    p=(int*)realloc(p,sizeof(int)*4); //重新申請記憶體空間
    p[3]=4;
    for(int i=0;i<4;++i)
        printf("%d\t",p[i]);
    printf("\n");
    free(p);
    return 0; 
}
           
C:15---動态記憶體管理(malloc、realloc、calloc、free)一、malloc()二、calloc()三、realloc()三、free()

三、free()

功能
  • 用來釋放malloc()、realloc()、calloc()函數申請的記憶體空間
  • 使用malloc()、realloc()、calloc()申請的記憶體空間如果使用完之後沒有釋放,那麼該位址無法被再通路和再使用,是以需要使用free()釋放申請的記憶體空間
參數
  • 一個指向記憶體位址的指針
  • 案例:每次調用函數都申請一塊記憶體空間,使用完之後釋放
#include <stdio.h> 
#include <stdlib.h>

void gobble(double arr[],int n)
{
	arr=(double*)malloc(n*sizeof(double));//申請
	free(arr); //釋放
}
int main()  
{      
	double myArr[50];
	for(int i=0;i<5;++i)
		fobble(myArr,50);
	return 0; 
}