1樓:濯利澤
c裡的。
例:int *pi;
float *pf;
pi=(int *)malloc(2);
pf=(float *)malloc(4);
2樓:蕊蕊花兒
c語言呼叫指令。返回值型別為 void *,呼叫格式為:malloc(size),size的型別為unsigned int 。
malloc函式用來分配size個位元組的儲存區,返回乙個指向儲存區首位址的基型別為void的位址。若沒有足夠的記憶體單元供分配,函式返回空(null)
通過呼叫malloc函式所分配的動態儲存單元中沒有確定的初值,這個儲存單元也沒有名字,吸能靠指標來引用它。
例:int *pi;
float *pf;
pi=(int *)malloc(2);
pf=(float *)malloc(4);
因為malloc函式的返回的位址為void *,在呼叫函式時,必須延用強制型別轉換將其轉換為所需要的型別。括號中的*號代表返回的是指標型別的
c語言中malloc是什麼?怎麼用? 10
3樓:guxuecan劍
c語言中malloc是動態記憶體分配函式。
函式原型:void *malloc(unsigned int num_bytes);
引數:num_bytes 是無符號整型,用於表示分配的位元組數;
返回值:如果分配成功則返回指向被分配記憶體的指標(此儲存區中的初始值不確定),否則返回空指標null。void* 表示未確定型別的指標,void *可以指向任何型別的資料,更明確的說是指申請記憶體空間時還不知道使用者是用這段空間來儲存什麼型別的資料(比如是char還是int或者其他型別);
標頭檔案:#include 或 #include (注意:alloc.h 與 malloc.h 的內容是完全一致的。)
功能:分配長度為num_bytes位元組的記憶體塊。
注意:當記憶體不再使用時,應使用free()函式將記憶體塊釋放。函式返回的指標一定要適當對齊,使其可以用於任何資料物件。
關於該函式的原型,在以前malloc返回的是char型指標,新的ansic標準規定,該函式返回為void型指標,因此必要時要進行型別轉換。
總結:malloc()函式其實就在記憶體中找一片指定大小的空間,然後將這個空間的首位址範圍給乙個指標變數,這裡的指標變數可以是乙個單獨的指標,也可以是乙個陣列的首位址,這要看malloc()函式中引數size的具體內容。
我們這裡malloc分配的記憶體空間在邏輯上連續的,而在物理上可以連續也可以不連續。對於我們程式設計師來說,我們關注的是邏輯上的連續,因為作業系統會幫我們安排記憶體分配,所以我們使用起來就可以當做是連續的。
程式例子:
# include
# include
int main(void)
int i = 5; //分配了4個位元組 靜態分配
int * p = (int *)malloc(sizeof(4));//指標變數p為靜態分配,malloc開闢的空間為動態分配
*p = 5; //*p 代表的就是乙個int變數,指標變數p表示是乙個以int型別的位址為內容的變數
free(p); //freep(p)表示把p所指向的記憶體給釋放掉,p本身的記憶體是靜態的,不能由程式設計師手動釋放
//p本身的記憶體只能在p變數所在的函式執行終止時由系統自動釋放
return 0;
擴充套件資料:
malloc在標準庫里的**實現:
#define null 0
#define memseze 8096
typedef double align;
typedef union header
struct s;
align a;
}header;
static header mem[memsize];
static header* memptr=null;
void* malloc(unsigned nbytes)
header *p,*newp;
unsigned nunits;
nunits=(nbytes+sizeof(header)-1)/sizeof(header)+1;
if(memptr==null)
memptr->s.next=memptr=mem;
memptr->s.usedsize=1;
memptr->s.freesize=memsize-1;
for(p=memptr;(p->s.next!=memptr) && (p->s.freesizes.next);
if(p->freesizenewp=p+p->s.usedsize;
newp->s.usedsize=nunits;
newp->s.freesize=p->s.freesize-nunits;
newp->s.next=p->s.next;
p->s.freesize=0;
p->s.next=newp;
memptr=newp;
return (void*)(newp+1);
void free(void* ap)
header *bp,*p,*prev;
bp=(header*)ap-1;
for(prev=memptr,p=memptr->s.next;
(p!=bp) && (p!=memptr);prev=p,p=p->next);
if(p!=bp) return;
prev->s.freesize+=p->s.usedsize+p->s.freesize;
prev->s.next=p->s.next;
memptr=prev;
c語言中malloc的意義:
malloc就是memory allocate動態分配記憶體,malloc的出現時為了彌補靜態記憶體分配的缺點,靜態分配記憶體有如下缺點:
1、比如說,傳統的一維陣列,如int a[5],使用傳統的一維陣列需要事先指定陣列的長度,而且陣列的長度必須是乙個常量(巨集定義的 常量)
2、傳統陣列(靜態分配),不能手動釋放,只能等待系統釋放,靜態分配的變數在該函式內執行的時候有效,當靜態分配的變數所在函式執行完之後,該記憶體會自動釋放。靜態分配的記憶體,是在棧中分配的,其實在c語言中的函式呼叫也是通過棧來實現的,棧這種資料結構的乙個特點就是(先進後出)。
所以,在呼叫函式的時候,都是先壓入棧中,然後,再從最上面的函式開始執行,最後,執行到main函式結束。動態分配通過malloc分配,是在堆中分配的,堆不是一種資料結構,它是一種排序方式,堆排序。
3、傳統陣列的長度一旦定義之後,就不能更改,比如說,如果我有乙個業務在這之前給分配的大小為100,但是,我現在由於業務數量的增長,原來的大小就無法滿足。
4、靜態分配不能跨函式呼叫,就是無法在另乙個函式中,來管理乙個函式中的記憶體。靜態分配,只在當前函式有效,當,靜態分配所在的函式執行完之後,該變數就不能被其他的函式所呼叫。
malloc是什麼意思呢?怎麼用?
4樓:火樹木林
malloc函式向系統申請分配指定size個位元組的記憶體空間。返回型別是 void* 型別。void* 表示未確定型別的指標。
c,c++規定,void* 型別可以強制轉換為任何其它型別的指標。
函式宣告:void *malloc(size_t size),void* 表示未確定型別的指標,void *可以指向任何型別的資料,更明確的說是指申請記憶體空間時還不知道使用者是用這段空間來儲存什麼型別的資料。
malloc函式的實質體現在,它有乙個將可用的記憶體塊連線為乙個長長的列表的所謂空閒鍊表。呼叫malloc函式時,它沿連線表尋找乙個大到足以滿足使用者請求所需要的記憶體塊。然後,將該記憶體塊一分為二(一塊的大小與使用者請求的大小相等,另一塊的大小就是剩下的位元組)。
接下來,將分配給使用者的那塊記憶體傳給使用者,並將剩下的那塊(如果有的話)返回到連線表上。
5樓:
c#語言裡乙個分配記憶體的函式吧
原型:extern void *malloc(unsigned int num_bytes);
用法:#include
或#include
功能:分配長度為num_bytes位元組的記憶體塊說明:如果分配成功則返回指向被分配記憶體的指標,否則返回空指標null。
當記憶體不再使用時,應使用free()函式將記憶體塊釋放。
malloc的語法是:指標名=(資料型別*)malloc(長度),(資料型別*)表示指標.
舉例:// malloc.c
#include
#include
main()
6樓:匿名使用者
函式名: malloc
功 能: 記憶體分配函式
用 法: void *malloc(unsigned size);
程式例:
#include
#include
#include
#include
int main(void)
/* copy "hello" into string */strcpy(str, "hello");
/* display string */
printf("string is %s\n", str);
/* free memory */
free(str);
return 0;}
在c語言中如何使用malloc動態申請一維陣列?
7樓:海天盛
malloc()函式用來動態地分配記憶體空間,其原型為:void*malloc(size_tsize);
描述:(引數描述)
size是以位元組為單位分配的記憶體空間量。
【功能描述】
malloc()在堆中分配指定大小的記憶體空間來儲存資料。函式執行後,此記憶體空間未初始化,且其值未知。如果希望在分配記憶體的同時進行初始化,可以使用calloc()函式。
(返回值)
分配成功時返回指向記憶體的位址,失敗時返回null。
操作:由於在請求記憶體空間時,可能有記憶體空間,也可能沒有記憶體空間,所以在繼續之前,您需要自己決定應用程式是否成功。
如果size的值為0,返回值可能為null,也可能不為null,這取決於標準庫實現,但是不應該再次引用返回的指標。
注意:函式的返回值型別為void*,void並不意味著沒有返回值或空指標,而是返回的指標型別未知。所以當你使用malloc()時,你通常需要將void指標轉換成你想要的型別,例如:
# include < stdlib。h >
typedefintlistdata;
listdata*資料;//儲存空間的基本位址
data=(listdata*)malloc(100*sizeof(listdata));
擴充套件資料:
實現malloc的方法:
(1)資料結構
首先,我們要確保資料結構。乙個簡單可行的解決方案是將堆記憶體空間組織成塊,每個塊由乙個元區域和乙個資料區域組成,元區域記錄關於資料塊的元資料(資料區域大小、空閒標誌位、指標等)。
資料區域是實際分配的記憶體區域,資料區域的第乙個位元組位址是malloc返回的位址。
(2)找到正確的街區
現在考慮如何在區塊鏈中找到合適的區塊。一般來說,有兩種搜尋演算法:
firstfit:從頭開始,使用第乙個大於所需大小的資料塊稱為已分配的塊
最佳匹配:從頭開始遍歷所有塊,使用資料區域大小大於大小且分配的塊的差異最小的塊
最適合的有乙個高的有效載荷和第乙個適合有乙個高的操作效率。這裡我們使用第乙個fit演算法。
(3)建立乙個新的塊如果現有的塊都不能滿足size的要求,則需要在列表的末尾建立乙個新的塊。
(4)分塊先拼裝有乙個致命的缺點,那就是它可能允許較小的尺寸佔據乙個較大的塊。在這種情況下,為了改進有效負載,當剩餘的資料區域足夠大時,應該將其劃分為乙個新的塊。
(5)malloc的實現
通過上面的**,我們可以實現乙個簡單的malloc。注意,首先我們需要定義鍊表的第乙個塊,first_block,初始化為null;此外,我們需要至少剩下的空間block_size+8來執行除法操作
因為我們需要malloc分配資料區域在8位元組處對齊,所以大小不適用於8個倍數,所以我們需要調整大小,使其大於8的最小倍數的大小。
c語言中malloc是什麼?怎麼用
檀香透窗櫺 malloc 函式用來動態地分配記憶體空間,其原型為 void malloc size t size 說明 引數說明 size 為需要分配的記憶體空間的大小,以位元組 byte 計。函式說明 malloc 在堆區分配一塊指定大小的記憶體空間,用來存放資料。這塊記憶體空間在函式執行完成後不...
「HECHO EN CHINA」是哪個國家的語言
hecho en china 是西班牙語。hecho en china 的意思是 中國製造,相當於英語的made in china。中國製造是乙個全方位的商品,它不僅包括物質成分,也包括文化成分和人文內涵。中國製造在進行物質產品出口的同時,也將人文文化和國內的商業文明連帶出口到國外。中國製造的商品在...
C語言裡5 3的值 是怎麼算出來的
橘落淮南常成枳 在c語言裡!的意思是 非 5 3就是5非等於3,就是5不等於3,這邏輯是對的,所以值是1 如果為3!3的話,值就為0了。是c語言中的非運算子,在變數前面使用它,會構建非運算表示式,表示式的返回結果是個布林值 也就是隻有true或false 對變數使用時,如果變數不是布林資料型別,將會...