c語言動態分配內存相關的幾種函數總結

筆者爲C語言新手,想分享並總結下相關學習心得,如有錯誤,望各位大牛指正。

malloc

原型:void *malloc(int byte_size);

作用:動態開闢byte_size個字節的內存空間,不進行初始化,返回指向此內存的指針,此指針所指數據類型沒有確定,需要強轉。

舉例:int *p=(int *)malloc(5*sizeof(int));

例解:動態開闢5*4=20個字節大小的空間,返回空間首地址指針並強轉爲int *型後賦予指針變量p

注意:malloc只開闢空間,不初始化,即只將此空間由未佔用狀態變爲已佔用狀態,空間內存儲的具體數據未指定改變。函數返回值是空間首地址,上例中賦給了p變量。

 

calloc

原型:void *calloc(int n,int type_byte_size);

作用:動態開闢n*type_byte_size個字節,將每個字節均初始化爲ascii0,返回指向此內存的指針,此指針所指數據類型沒有確定,需要強轉。

舉例:int *p=(int *)calloc(5,sizeof(int));

例解:動態開闢5*4=20個字節大小的空間,其中每個字節均賦初值0,返回空間首地址指針並強轉爲int *型後賦予指針變量p

注意:callocmalloc的基礎上將空間按字節初始化爲ascii0,且其參數有兩個,兩參數之積爲空間總字節數。

 

realloc

原型:void *realloc(void *p,int byte_size);

作用:若p所指空間連續大小(單位字節)大於byte_size,則從首地址開始連續地擴充開闢p所指空間至byte_size字節,不對空間再次賦值,將空間地址指針返回;若p所指空間連續大小小於byte_size,則新開闢byte_size字節大小的空間,將p指向的空間內的數據複製進新空間,之後釋放p所指空間(此時pNULL),返回指向新空間的指針,此指針所指數據類型沒有確定,需要強轉。

舉例:int *p=(int *)calloc(5,sizeof(int));

      p =(int*)realloc(p,10*sizeof(int));

例解:首句中p5*4=20字節的空間指針並按字節初始化爲ascii0(int *)強轉後才限定了指向空間的每個元素爲int型。後句將p所指空間擴充爲10*4=40字節的空間指針,未對其二次賦值,故此時p[0]~p[4]0p[5]~p[9]未初始化。

 

memset

原型:void *memset(void *p,char c,int byte_size);

作用:將p所指的大小爲byte_size字節的空間按字節賦值爲字符變量c(即指定的ascii碼),返回空間首地址指針,此指針所指數據類型沒有確定,需要強轉。memset所在頭文件爲memory.h

舉例:int *p=(int *)malloc(5*sizeof(int));

      p =(int*)memset(p,3,5*sizeof(int));

例解:第二句中將p所指空間(5*4個字節大小)按字節賦值爲ascii3,即每個32位均爲00000011000000110000001100000011,轉化爲十進制爲50529027。之後將返回的指針強轉爲(int*)後賦給p

注意:按字節賦予ascii碼值並非按原數據類型賦值,強轉後確定數據類型,輸出結果會很“奇怪”。

 

測試代碼:(malloc省略)

// 動態分配內存測試.cpp: 定義控制檯應用程序的入口點。

//

 

#include "stdafx.h"

#include "stdio.h"

#include "stdlib.h"

#include" conio.h"

#include "memory.h"

int _tmain(int argc,_TCHAR* argv[])

{

         int *p;

         p=(int *)calloc(5,sizeof(int));

         if(!p)

         {

                   printf("calloc分配失敗1");

                   _getch();

                   exit(0);

         }

         for(int i=0;i<5;++i)

                   printf("c:p[%d]=%d\n",i,p[i]);

         p=(int *)realloc(p,10*sizeof(int));

         if(!p)

         {

                   printf("realloc分配失敗2");

                   _getch();

                   exit(0);

         }

         for(int i=0;i<10;++i)

                   printf("r:p[%d]=%d\n",i,p[i]);

         int *q=(int *)memset(p,3,10*sizeof(int));

         if(!q)

         {

                   printf("memset分配失敗3");

                   _getch();

                   exit(0);

         }

         p=(int *)memset(p,3,10*sizeof(int));

         for(int i=0;i<10;++i)

                   printf("m:q[%d]=%d\n",i,q[i]);

         for(int i=0;i<10;++i)

                   printf("m:p[%d]=%d\n",i,p[i]);

         free(p);

         q=NULL;

         _getch();

         return0;

}

 

 

運行結果:

 


 

32位按字節賦ascii3(每8位均爲00000011),轉爲10進制(DEC)如下:

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