⑴ c語言中 malloc和calloc怎麼用有什麼區別使用時該注意些什麼
這是申請內存的函數,存在前斗與頭文件stdlib.h中,malloc的使族沒用方法最簡單接下來是例子:
#include<stdlib.h>#include<stdio.h>main(){int
*m;m=(int
*)malloc(sizeof(int)*16);//這里每次在使用malloc的時候前面要加一個強制類兆悔納型轉換,轉換到你需要的類型,後面的括弧內就是申請的大小,我這例子是申請的16個整數型大小內存代表這個M可以當數組用了m[11]=8899;printf("%d",m[11]);free(m);//記得每次申請後都需要釋放內存,不然會造成浪費影響計算機運行速度}calloc是申請後自動將申請的內存全都初始化為0舉個例子:#include<stdio.h>#include<stdlib.h>main(){int
*m;m=(int
*)calloc(16,sizeof(int));//是不是感覺差不多就是把*改成了,而已printf("%d",m[10]);//這個肯定是0free(m);}
將他們的原型放在這里void
*malloc(int
size);
void
*calloc(int
number,int
size);
size代表大小,number代表個數
⑵ C語言中malloc()和calloc()有什麼區別
這是申請內存的函數,存在與頭文件stdlib.h中,malloc的使用方法最簡單接下來是例子:
#include<stdlib.h>
#include<stdio.h>
main()
{
int
*m;
m=(int
*)malloc(sizeof(int)*16);//這里每次在使用malloc的時候前面要加一個強制類型轉換,轉換到你需要的類型,後面的括弧內就是申請的大小,我這例子是申請的16個整數型大小內存代表這個m可以當數組用了
m[11]=8899;
printf("族沒%d",m[11]);
free(m);//記得每次兆悔納申請後都需要釋放內存,不然會造成浪費影響計算機運行速前斗度
}
calloc是申請後自動將申請的內存全都初始化為0
舉個例子:
#include<stdio.h>
#include<stdlib.h>
main()
{
int
*m;
m=(int
*)calloc(16,sizeof(int));//是不是感覺差不多就是把*改成了,而已
printf("%d",m[10]);//這個肯定是0
free(m);
}
將他們的原型放在這里void
*malloc(int
size);
void
*calloc(int
number,int
size);
size代表大小,number代表個數
⑶ 二級C中malloc函數和calloc函數的區別
函數malloc()和calloc()都可以用來動態分配內存空間,但兩者稍有區別。
malloc()函數有一個參數,即要分配的內存空間的大小:
void
*malloc(size_t
size);
calloc()函數有兩個參數,分別為元素的數目和每個元素的大小,這兩個參數的乘積就是要分配的內存空間的大輪段小。
山桐握void
*calloc(size_t
numElements,
size_t
sizeof
(Element));
如果調用成功,函數malloc()和函數calloc()都將返回所分配的內存空間的首地址。
函數malloc()和函數calloc()的主要區別是前者不能初始化所分配的內存空間,而後者能。
如果由malloc()函數分配的內存空間原來沒有被使用過,則其中的每一位可能都是0;反之,如果這部分內存曾經被分配過,則其中可能遺留有各種各樣的數據。也就是說,使用malloc()函數的程序開始時(內存空間還沒有被重新分配)能正常進行,但經逗慶過一段時間(內存空間還已經被重新分配)可能會出現問題。
函數calloc()會將所分配的內存空間中的每一位都初始化為零,也就是說,如果你是為字元類型或整數類型的元素分配內存,那麽這些元素將保證會被初始化為0;如果你是為指針類型的元素分配內存,那麽這些元素通常會被初始化為空指針;如果你為實型數據分配內存,則這些元素會被初始化為浮點型的零。
⑷ C語言中的 malloc,calloc函數分配存儲空間是隨機的嗎
是的,malloc和calloc函數都是向內存申請一定大小的輪乎困空間,如果臘念內存分配成功則返回指向被分配內存的指針(此存儲頃改區中的初始值不確定),否則返回空指針NULL。
⑸ C語言calloc函數
calloc函數的功能與malloc函數的功能相似,都是從堆山胡褲分配內存。
函數名:calloc
函數原型:void*calloc(intn,intsize);
功能:函數返回值為void型指針。如果執行成功,函數從堆上獲得sizeXn的位元組空間,並返回該空間的首地址。如果執行失敗,函數返回NULL。該函數與malloc函數的一個顯著不同時是做稿,calloc函數得到的內存逗簡空間是經過初始化的,其內容全為0。calloc函數適合為數組申請空間,可以將size設置為數組元素的空間長度,將n設置為數組的容量。
示例代碼:
#include<stdio.h>
#include<stdlib.h>
#defineSIZE5
intmain()
{
int*p=NULL;
inti=0;
//為p從堆上分配SIZE個int型空間
p=(int*)calloc(SIZE,sizeof(int));
if(NULL==p){
printf("Errorincalloc. ");
return-1;
}
//為p指向的SIZE個int型空間賦值
for(i=0;i<SIZE;i++)
p[i]=i;
//輸出各個空間的值
for(i=0;i<SIZE;i++)
printf("p[%d]=%d ",i,p[i]);
free(p);
p=NULL;
return0;
}
⑹ 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 ) );
(6)c語言callocmalloc擴展閱讀
實現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函數用法>
C語言中malloc是動態內存分配函數。
函數原型:void *malloc(unsigned int num_bytes)。
參數:num_bytes 是無符號整型,用於表示分配的位元組數。
注意:當內存不再使用時,應使用free()函數將內存塊釋放。函數返回的指針一定要適當對齊,使其可以用於任何數據對象。關於該函數的原型,在以前malloc返回的是char型指針,新的ANSIC標准規定,該函數返回為void型指針,因此必要時要進行類型轉換。
實現malloc的方法:
首先我們要確定所採用的數據結構。一個簡單可行方案是將堆內存空間以塊的形式組織起來,每個塊由meta區和數據區組成,meta區記錄數據塊的元信息(數據區大小、空閑標志位、指針等等)。
數據區是真實分配的內存區域,並且數據區的第一個位元組地址即為malloc返回的地址 。
⑻ calloc和malloc的區別
1.分配內存空間函數malloc
調用形式: (類型說明符*) malloc (size)
功能:在內存的動態存儲區中分配一塊長度為"size" 位元組的連續區域。函數的返回值為該區域的首地址。
「類型說明符」表示把該區域用於何種數據類型。(類型說明嫌掘符*)表示把返回值強制轉換為該類型指針。「size」是一個無符號數。例如:
pc=(char *) malloc (100); 表示分配100個位元組的內存空間,並強制轉換為字元數組類型,
函數的返回值為指向該字元數組的指針, 把該指針賦予指針變數pc。
2.分配內存空間函數 calloc
calloc 也用於分配內存空間。調用形式: (類型說明符*)calloc(n,size)
功能:在內存動態存儲區中分配n塊長度為「size」位元組的連續區域。函數的返回值為該區域的首地址。(類型說明符*)用於強制類型轉換。calloc函
數與malloc 函數的區別僅在於一次可以分配n塊區域。例如: ps=(struet stu*) calloc(2,sizeof (struct
stu)); 其中的sizeof(struct
stu)是求stu的結構長度。因此該語句的意思是:按stu的長度分配2塊連續區域,強制轉換咐弊為stu類型,並把其首地址賦衡者族予指針變數ps。
簡單的說是:
malloc它允許從空間內存池中分配內存,malloc()的參數是一個指定所需位元組數的整數.
例如:P=(int*)malloc(n*sizeof(int));
colloc與malloc類似,但是主要的區別是存儲在已分配的內存空間中的值默認為0,使用malloc時,已分配的內存中可以是任意的值.
colloc需要兩個參數,第一個是需要分配內存的變數的個數,第二個是每個變數的大小.
例如:P=(int*)colloc(n,colloc(int));
⑼ c語言字元串數組動態分配內存的問題(malloc()/calloc())
str=(char**)calloc(m,sizeof(char*));//分配m個char指針
for(inti=0;i<m;i++)
{
str[i]=calloc(1,100*sizeof(char));//為每個char指針分配100個char
}