c語言實現malloc
A. c語言中的malloc函數用法>
C語言中malloc是動態內存分配函數。
函數原型:void *malloc(unsigned int num_bytes)。
參數:num_bytes 是無符號整型,用於表示分配的位元組數。
注意:當內存不再使用時,應使用free()函數將內存塊釋放。函數返回的指針一定要適當對齊,使其可以用於任何數據對象。關於該函數的原型,在以前malloc返回的是char型指針,新的ANSIC標准規定,該函數返回為void型指針,因此必要時要進行類型轉換。
實現malloc的方法:
首先我們要確定所採用的數據結構。一個簡單可行方案是將堆內存空間以塊的形式組織起來,每個塊由meta區和數據區組成,meta區記錄數據塊的元信息(數據區大小、空閑標志位、指針等等)。
數據區是真實分配的內存區域,並且數據區的第一個位元組地址即為malloc返回的地址 。
B. C語言:簡單的malloc函數
int *p = (int*)malloc(1);聲明了一個int*型指針,並初始化為malloc分配的空間首地址,但空間大小隻有1位元組。這個語句沒有語法錯誤,指針類型也正確,只是內存分配不夠。它帶來的問題是潛在的:一般情況下,動態在堆上分配的空間是從偶數地址開始,最小間隔48個位元組,這里只分配了1位元組,那就有47個位元組還空閑著;盡管一個int要4位元組,但既然後面跟著47個空閑位元組,它也就用了,C並不做這個邊界限制。但是未分配的空間不受程序控制,是由系統控制的,說不定什麼時候會把跟在p後面的一塊分配給「別人」,如果「別人」在這一塊又做了寫操作,那輸出就一般就不再是100000了,所以這樣寫是錯誤的,也是危險的。不過這還與編譯器有關,有些編譯器可能不是以48位元組為間隔的,若是以2位元組為間隔,那要是緊接著又分配了內存,4位元組的int數就要侵佔「別人」的地方了,會造成嚴重錯誤……
C. C語言的malloc函數是怎麼實現的
需要包含頭文件:
#i nclude
或
#i nclude
函數聲明(函數原型):
void *malloc(int size);
說明:malloc 向系統申請分配指定size個位元組的內存空間。返回類型是 void* 類型。void* 表示未確定類型的指針。C,C++規定,void* 類型可以強制轉換為任何其它類型的指針。
從函數聲明上可以看出。malloc 和 new 至少有兩個不同: new 返回指定類型的指針,並且可以自動計算所需要大小。比如:
int *p;
p = new int; //返回類型為int* 類型(整數型指針),分配大小為 sizeof(int);
或:
int* parr;
parr = new int [100]; //返回類型為 int* 類型(整數型指針),分配大小為 sizeof(int) * 100;
而 malloc 則必須由我們計算要位元組數,並且在返回後強行轉換為實際類型的指針。
int* p;
p = (int *) malloc (sizeof(int));
第一、malloc 函數返回的是 void * 類型,如果你寫成:p = malloc (sizeof(int)); 則程序無法通過編譯,報錯:「不能將 void* 賦值給 int * 類型變數」。所以必須通過 (int *) 來將強制轉換。
第二、函數的實參為 sizeof(int) ,用於指明一個整型數據需要的大小。如果你寫成:
int* p = (int *) malloc (1);
代碼也能通過編譯,但事實上只分配了1個位元組大小的內存空間,當你往裡頭存入一個整數,就會有3個位元組無家可歸,而直接「住進鄰居家」!造成的結果是後面的內存中原有數據內容全部被清空。
malloc 也可以達到 new [] 的效果,申請出一段連續的內存,方法無非是指定你所需要內存大小。
比如想分配100個int類型的空間:
int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100個整數的內存空間。
另外有一點不能直接看出的區別是,malloc 只管分配內存,並不能對所得的內存進行初始化,所以得到的一片新內存中,其值將是隨機的。
除了分配及最後釋放的方法不一樣以外,通過malloc或new得到指針,在其它操作上保持一致。
D. c語言malloc如何實現動態分配
函數原型:extern void *malloc(unsigned int num_bytes);
需要頭文件:#include <stdlib.h>
功能:分配長度為num_bytes位元組的內存塊
返回值:如果分配成功則返回指向被分配內存的指針(此存儲區中的初始值不確定),否則返回空指針NULL。當內存不再使用時,應使用free()函數將內存塊釋放。函數返回的指針一定要適當對齊,使其可以用於任何數據對象。
說明:關於該函數的原型,在以前malloc返回的是char型指針,新的ANSIC標准規定,該函數返回為void型指針,因此必要時要進行類型轉換。
示例:
/*取一列整數,並按升序排列他們,最後列印*/
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
intcompare_integers(constvoid*a,constvoid*b)
{
int*pa=(int*)a;
int*pb=(int*)b;
/*return*pa>*pb?1:*pa<*pb?-1:0;*/
return*pa-*pb;
}
intmain()
{
int*array;
intn_values;
inti;
printf("howmanyvaluesarethere?");
if(scanf("%d",&n_values)!=1||n_values<=0)
{
printf("illegalnumberofvalues. ");
exit(EXIT_FAILURE);
}
array=(int*)malloc(n_values*sizeof(int));//分配內存,用於存儲這些值
if(array==NULL)
{
printf("can'tgetmemoryforthatmanyvalues. ");
exit(EXIT_FAILURE);
}
for(i=0;i<n_values;i+=1)
{
printf("?");
if(scanf("%d",array+i)!=1)
{
printf("ERRORreadingvalue#%d ",i);
free(array);
exit(EXIT_FAILURE);
}
}
qsort(array,n_values,sizeof(int),compare_integers);//使用快速排序法進行排序
for(i=0;i<n_values;i+=1)
{
printf("%d ",array[i]);
}
free(array);
returnEXIT_SUCCESS;
}
E. C語言中怎麼使用malloc函數
malloc只是動態分配內存存儲空間。
void *malloc(long nBytes):該函數分配了nBytes個位元組,並返回了指向這塊內存的指針。如果分配失敗,則返回一個空指針(NULL)
例如:char *Ptr = NULL;
Ptr = (char *)malloc(100 * sizeof(char));
就是這樣!當然,具體情況要具體分析以及具體解決。比如說,你定義了一個指針,在一個函數里申請了一塊內存然後通過函數返回傳遞給這個指針,那麼也許釋放這塊內存這項工作就應該留給其他函數了