① c語言問題 malloc函數的頭文件是什麼
原型:extern void *malloc(unsigned int num_bytes);
頭文件:在TC2.0中可以用malloc.h或 alloc.h (注意:alloc.h 與 malloc.h 的內容是完全一致的),而在Visual C++6.0中可以用malloc.h或者stdlib.h。
功能:分配長度為num_bytes位元組的內存塊
返回值:如果分配成功則返回指向被分配內存的指針(此存儲區中的初始值不確定),否則返回空指針NULL。當內存不再使用時,應使用free()函數將內存塊釋放。函數返回的指針一定要適當對齊,使其可以用於任何數據對象。
說明:關於該函數的原型,在舊的版本中malloc返回的是char型指針,新的ANSIC標准規定,該函數返回為void型指針,因此必要時要進行類型轉換。
名稱解釋:malloc的全稱是memory allocation,中文叫動態內存分配,當無法知道內存具體位置的時候,想要綁定真正的內存空間,就需要用到動態的分配內存。
相關函數:calloc、realloc、free、_alloca
② malloc怎麼使用,請舉例說明,謝謝!
malloc使用須要包括頭文件:
#include 'stdlib.h'
例如:
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 * 類型。
對於C++,如果你寫成:p = malloc (sizeof(int)); 則程序無法通過編譯,報錯:「不能將 void* 賦值給 int * 類型變數」。
所以必須通過 (int *) 來將強制轉換。而對於C,沒有這個要求,但為了使C程序更方便的移植到C++中來,養成強制轉換的習慣。
在Linux中可以有這樣:malloc(0),這是因為Linux中malloc有一個下限值16Bytes,注意malloc(-1)是禁止的;但是在某些系統中是不允許malloc(0)的。
在規范的程序中我們有必要按照這樣的格式去使用malloc及free:
type*p;
if(NULL==(p=(type*)malloc(sizeof(type))))
/*請使用if來判斷,這是有必要的*/
{
perror("error...");
exit(1);
}
.../*其它代碼*/
free(p);
p=NULL;/*請加上這句*/③ linux kernel 使用malloc 需要include哪個文件
linux kernel中一般是沒有malloc的定義的了,malloc一般是用戶態裡面的;有的話,也是被define的;
在linux kernel中申請/釋放內存,建議使用kmalloc/kfree;
如果真的要使用malloc,你需要自己實現malloc,或者在你使用的kernel代碼中grep malloc,看一下是否有定義,參考使用;
④ malloc函數在stdlib.h頭文件或malloc.h頭文件中都有,它們有什麼區別
因為stdlib.h頭文件中
有#include<malloc.h>這一段。
即stdlib.h頭文件包含了malloc.h.
⑤ malloc怎麼用呢
原型
extern void *malloc(unsigned int num_bytes);
頭文件
#include <stdlib.h>
功能
分配長度為num_bytes位元組的內存塊
返回值
如果分配成功則返回指向被分配內存的指針(此存儲區中的初始值不確定),否則返回空指針NULL。當內存不再使用時,應使用free()函數將內存塊釋放。函數返回的指針一定要適當對齊,使其可以用於任何數據對象。
說明
關於該函數的原型,在以前malloc返回的是char型指針,新的ANSIC標准規定,該函數返回為void型指針,因此必要時要進行類型轉換。
名稱解釋
malloc的全稱是memory allocation,中文叫動態內存分配,當無法知道內存具體位置的時候,想要綁定真正的內存空間,就需要用到動態的分配內存。
相關函數
calloc、realloc、free、_alloca
2函數聲明編輯
全名
void *malloc(size_t size);
備注
void* 表示未確定類型的指針,void *可以指向任何類型的數據,更明確的說是指申請內存空間時還不知道用戶是用這段空間來存儲什麼類型的數據(比如是char還是int或者...)
3與new的區別編輯
從本質上來說,malloc(Linux上具體實現可以參考man malloc,glibc通過brk()&mmap()實現)是libc裡面實現的一個函數,如果在source code中沒有直接或者間接include過stdlib.h,那麼gcc就會報出error:『malloc』 was not declared in this scope。如果生成了目標文件(假定動態鏈接malloc),如果運行平台上沒有libc(Linux平台,手動指定LD_LIBRARY_PATH到一個空目錄即可),或者libc中沒有malloc函數,那麼會在運行時(Run-time)出錯。new則不然,是c++的關鍵字,它本身不是函數。new不依賴於頭文件,c++編譯器就可以把new編譯成目標代碼(g++4.6.3會向目標中插入_Znwm這個函數,另外,編譯器還會根據參數的類型,插入相應的構造函數)。
在使用上,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)*128);
//分配128個(可根據實際需要替換該數值)整型存儲單元,
//並將這128個連續的整型存儲單元的首地址存儲到指針變數p中
double*pd=(double*)malloc(sizeof(double)*12);
//分配12個double型存儲單元,
//並將首地址存儲到指針變數pd中
第一、malloc 函數返回的是 void * 類型。對於C++,如果你寫成:p = malloc (sizeof(int)); 則程序無法通過編譯,報錯:「不能將 void* 賦值給 int * 類型變數」。所以必須通過 (int *) 來將強制轉換。而對於C,沒有這個要求,但為了使C程序更方便的移植到C++中來,建議養成強制轉換的習慣。
第二、函數的實參為 sizeof(int) ,用於指明一個整型數據需要的大小。
在Linux中可以有這樣:malloc(0),這是因為Linux中malloc有一個下限值16Bytes,注意malloc(-1)是禁止的;
但是在某些系統中是不允許malloc(0)的。在規范的程序中我們有必要按照這樣的格式去使用malloc及free:
type*p;
if(NULL==(p=(type*)malloc(sizeof(type))))
/*請使用if來判斷,這是有必要的*/
{
perror("error...");
exit(1);
}
.../*其它代碼*/
free(p);
p=NULL;/*請加上這句*/
malloc 也可以達到 new [] 的效果,申請出一段連續的內存,方法無非是指定你所需要內存大小。
比如想分配100個int類型的空間:
int*p=(int*)malloc(sizeof(int)*100);
//分配可以放得下100個整數的內存空間。
另外有一點不能直接看出的區別是,malloc 只管分配內存,並不能對所得的內存進行初始化,所以得到的一片新內存中,其值將是隨機的。
除了分配及最後釋放的方法不一樣以外,通過malloc或new得到指針,在其它操作上保持一致。
對其做一個特例補充
char*ptr;
if((ptr=(char*)malloc(0))==NULL)
puts("Gotanullpointer");
else
puts("Gotavalidpointer");
此時得到的是Got a valid pointer。把0賦給malloc能得到一個合法的指針。
4工作機制編輯
malloc函數的實質體現在,它有一個將可用的內存塊連接為一個長長的列表的所謂空閑鏈表。調用malloc函數時,它沿連接表尋找一個大到足以滿足用戶請求所需要的內存塊。然後,將該內存塊一分為二(一塊的大小與用戶請求的大小相等,另一塊的大小就是剩下的位元組)。接下來,將分配給用戶的那塊內存傳給用戶,並將剩下的那塊(如果有的話)返回到連接表上。調用free函數時,它將用戶釋放的內存塊連接到空閑鏈上。到最後,空閑鏈會被切成很多的小內存片段,如果這時用戶申請一個大的內存片段,那麼空閑鏈上可能沒有可以滿足用戶要求的片段了。於是,malloc函數請求延時,並開始在空閑鏈上翻箱倒櫃地檢查各內存片段,對它們進行整理,將相鄰的小空閑塊合並成較大的內存塊。如果無法獲得符合要求的內存塊,malloc函數會返回NULL指針,因此在調用malloc動態申請內存塊時,一定要進行返回值的判斷。
Linux Libc6採用的機制是在free的時候試圖整合相鄰的碎片,使其合並成為一個較大的free空間。
5程序示例編輯
正常程序
typedef struct data_type{
intage;
charname[20];
}data;
data*bob=NULL;
bob=(data*)malloc(sizeof(data));
if(bob!=NULL)
{
bob->age=22;
strcpy(bob->name,"Robert");
printf("%sis%dyearsold\n",bob->name,bob->age);
}
else
{
printf("mallocerror!\n");
exit(-1);
}
free(bob);
bob=NULL;
內存泄漏實例
例1:
#include<stdio.h>
#include<malloc.h>
#defineMAX100000000
intmain(void)
{
int*a[MAX]={NULL};
inti;
for(i=0;i<MAX;i++){
a[i]=(int*)malloc(MAX);
}
return0;
}
例2:
#include"stdio.h"
#include"malloc.h"//malloc()函數被包含在malloc.h裡面
int main(void)
{
char*a=NULL;//聲明一個指向a的char*類型的指針
a=(char*)malloc(100*sizeof(char));//使用malloc分配內存的首地址,然後賦值給a
if(!a)//如果malloc失敗,可以得到一些log
{
perror("malloc");
return-1;
}
sprintf(a,"%s","HelloWorld\n");//"HelloWorld\n"寫入a指向的地址
printf("%s\n",a);//輸出用戶輸入的數據
free(a);//釋放掉使用的內存地址
return0;//例2有無內存泄露?
}
例1:對malloc申請之後沒有檢測返回值;
例2:檢測malloc返回值條件有誤。
⑥ malloc 函數在哪個頭文件
malloc本身就是庫函數 包含在malloc.h這個頭文件中 不過 由於malloc.h被更常用的stdlib.h包含。
⑦ Linux C語言 malloc 函數
Queue的定義在哪
要轉換類型 = (*類型)malloc(sizeof(類型))
⑧ malloc函數頭文件用哪個有的寫malloc.h ,有的寫stdlib.h ,還有的寫alloc.h 。。。。
簡單來說, 在Microsoft Visual C++環境下,malloc.h和stdlib.h中都包含了對malloc函數的聲明,所以包含任何一個都可以調用malloc函數;而alloc.h是Borland C++環境下的頭文件,也是Linux/Unix環境下進行C語言開發的頭文件,所以在這些環境下調用malloc函數要包含alloc.h。
⑨ c語言中malloc是什麼怎麼用
malloc() 函數用來動態地分配內存空間,其原型為:void* malloc (size_t size);
說明:
【參數說明】
size 為需要分配的內存空間的大小,以位元組(Byte)計。
【函數說明】
malloc() 在堆區分配一塊指定大小的內存空間,用來存放數據。這塊內存空間在函數執行完成後不會被初始化,它們的值是未知的。如果希望在分配內存的同時進行初始化,請使用 calloc() 函數。
【返回值】
分配成功返回指向該內存的地址,失敗則返回 NULL。
操作:
由於申請內存空間時可能有也可能沒有,所以需要自行判斷是否申請成功,再進行後續操作。
如果 size 的值為 0,那麼返回值會因標准庫實現的不同而不同,可能是 NULL,也可能不是,但返回的指針不應該再次被引用。
注意:函數的返回值類型是 void *,void 並不是說沒有返回值或者返回空指針,而是返回的指針類型未知。所以在使用 malloc() 時通常需要進行強制類型轉換,將 void 指針轉換成我們希望的類型,例如:
#include<stdlib.h>
typedef int ListData;
ListData *data; //存儲空間基址
data = ( ListData * ) malloc( 100 * sizeof ( ListData ) );
(9)linuxmalloc頭文件擴展閱讀
實現malloc的方法:
(1)數據結構
首先我們要確定所採用的數據結構。一個簡單可行方案是將堆內存空間以塊的形式組織起來,每個塊由meta區和數據區組成,meta區記錄數據塊的元信息(數據區大小、空閑標志位、指針等等)。
數據區是真實分配的內存區域,並且數據區的第一個位元組地址即為malloc返回的地址 。
(2)尋找合適的block
現在考慮如何在block鏈中查找合適的block。一般來說有兩種查找演算法:
First fit:從頭開始,使用第一個數據區大小大於要求size的塊所謂此次分配的塊
Best fit:從頭開始,遍歷所有塊,使用數據區大小大於size且差值最小的塊作為此次分配的塊
兩種方式各有千秋,best fit有較高的內存使用率(payload較高),而first fit具有較高的運行效率。這里我們採用first fit演算法。
(3)開辟新的block
如果現有block都不能滿足size的要求,則需要在鏈表最後開辟一個新的block。
(4)分裂block
First fit有一個比較致命的缺點,就是可能會讓更小的size占據很大的一塊block,此時,為了提高payload,應該在剩餘數據區足夠大的情況下,將其分裂為一個新的block。
(5)malloc的實現
有了上面的代碼,我們就可以實現一個簡單的malloc.注意首先我們要定義個block鏈表的頭first_block,初始化為NULL;另外,我們需要剩餘空間至少有BLOCK_SIZE+8才執行分裂操作
由於我們需要malloc分配的數據區是按8位元組對齊,所以size不為8的倍數時,我們需要將size調整為大於size的最小的8的倍數。
⑩ 在C++中引用malloc的頭文件是什麼》
Linux版:
malloc(配置內存空間)
相關函數 calloc,free,realloc,brk
表頭文件 #include<stdlib.h>
定義函數 void * malloc(size_t size);
函數說明 malloc()用來配置內存空間,其大小由指定的size決定。
返回值 若配置成功則返回一指針,失敗則返回NULL。
範例 void p = malloc(1024); /*配置1k的內存*/
其它版的也相差不多