隨堂筆記(二) 記憶體分配函式

2021-07-14 06:05:39 字數 1436 閱讀 1931

malloc()函式就是在記憶體中找一片指定大小的空間,然後將這個空間的首位址範圍給乙個指標變數,這裡的指標變數可以是乙個單獨的指標,也可以是乙個陣列的首位址,這要看malloc()函式中引數size的具體內容。

void * __cdecl malloc(_in_ size_t _size);//函式原型

int *p =(int *)malloc(sizeof(int)*10); //記憶體分配

//malloc不會初始化位址內的資料,需要使用者手動初始化

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

在使用malloc後分配的記憶體大小將不會發生變化,這裡要特別注意陣列越界問題。

在上面我們提到了陣列越界問題,這在程式設計中已經是典型的錯誤了。如果已經申請記憶體了,但我們又想要插入乙個資料,最簡單的方法就是回到malloc最初**行,修改分配的記憶體的大小。但c/c++為我們提供了一種記憶體擴充套件功能,這是我們如果想要擴充套件malloc已分配的記憶體則使用函式realloc。

使用realloc擴充套件記憶體,有兩種情況,一種是malloc之後的記憶體沒有被占用,則自動向下擴充套件;若被占用,則重新分配位址,並拷貝原來的資料。

//情況一:位址擴充套件成功

//px的實體地址與p的位址相接,向下拓展

//向下的位址夠用,拓展成功,可以直接插入

int *p =malloc(sizeof(int)*10);

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

int *px = realloc(p,44);

p[11] = 11;

//情況二:位址擴充套件失敗

//向下的位址不夠大,拓展失敗,則重新分配的記憶體並將拷貝原有的資料,

//釋放原來的記憶體

int *p_p = malloc(100);

int *px= realloc(p,200);

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

初始化為零,引數意義是:指標大小 ,單個元素大小

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

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

_recalloc 函式類似於realloc函式,唯一不同的是分配記憶體時將記憶體清零。

第乙個引數是個數,第二個是元素大小

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

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

int *pp = recalloc(p,50,sizeof(int));

for(int i =25;i<50;i++)

malloc和realloc、calloc和_recalloc 成對使用,前者不同於後者的是前者申請或擴充套件記憶體時不會初始化記憶體,但後者會將記憶體清零。

CUDA 二 記憶體分配函式

除了前面提到的記憶體分配函式cudamalloc之外,這裡再簡單的介紹幾個常用的記憶體分配函式 cudamallocpitch cudamalloc3d等。cudaerror t cudamallocpitch void devptr,size t pitch,size t width,size t...

記憶體分配函式

2.c中提供堆區供給開發者分配記憶體空間,動態記憶體分配函式malloc,calloc,realloc 1 malloc函式的使用,原型為void malloc int length 引數為分配記憶體空間的大小 將記憶體分配4個位元組給乙個int型指標 返回值為任何指標 考慮到不同平台,可以使用si...

記憶體分配函式

1 malloc 函式 void malloc unsigned int size 在記憶體的動態分配區域中分配乙個長度為size的連續空間,如果分配成功,則返回所分配記憶體空間的首位址,否則返回null,申請的記憶體不會進行初始化。2 calloc 函式 void calloc unsigned ...