大家好,今天給各位分享malloc函數的返回值的一些知識,其中也會對函數malloc的功能進行解釋,文章篇幅可能偏長,如果能碰巧解決你現在面臨的問題,別忘了關注本站,現在就馬上開始吧!
c語言函數返回地址
1、函數直接返回一個指針類型即返回地址。2、C語言屬于高級編程語言。在C語言中一個函數不能返回局部地址即指針。例:int*func(void){inta=10;int*p=&a;returnp;}a變量的區域是func()函數,在函數內有效,出了函數就釋放了,此時p指向的是一個未知地址,屬于錯誤用法。正確用法:int*p=NULL;int*func(void){p=malloc(sizeof(int));if(p!=NULL){*p=10;}returnp;}
void默認返回值
調用void函數應將void語句單獨作為命令來執行。
在正常情況下,所謂“無返回值”是不存在的,省略了返回類型的函數,默認為void,表示返回值為“空”,而不是沒有返回值,且在函數結束時默認返回。
malloc失敗的原因
malloc()函數失敗的常見原因:
1.內存不足。
2.在前面的程序中出現了內存的越界訪問,導致malloc()分配函數所涉及的一些信息被破壞。下次再使用malloc()函數申請內存就會失敗,返回空指針NULL(0)。
分析排查原因:
查看方式:
1、內存不足,使用free命令查看當前還有多少內存,看是否合理,之前是否有內存泄漏等。
2、按照流程查看malloc失敗前的幾次malloc、memcpy或字符串拷貝等,查看是否有內存越界。
c動態分配函數有什么用
根據使用函數不同,作用各不相同。共同點均是動態分配一段內存,使用后需要用free函數釋放。所有動態分配函數均聲明在stdlib.h中。
1malloc
void*malloc(unsignedintnum_bytes);
功能
分配長度為num_bytes字節的內存塊
返回值
如果分配成功則返回指向被分配內存的指針(此存儲區中的初始值不確定),否則返回空指針NULL。當內存不再使用時,應使用free()函數將內存塊釋放。函數返回的指針一定要適當對齊,使其可以用于任何數據對象。
說明
關于該函數的原型,在以前malloc返回的是char型指針,新的ANSIC標準規定,該函數返回為void型指針,因此必要時要進行類型轉換。
2calloc
void*calloc(size_tn,size_tsize);
在內存的動態存儲區中分配n個長度為size的連續空間,函數返回一個指向分配起始地址的指針;如果分配不成功,返回NULL。
calloc在動態分配完內存后,自動初始化該內存空間為零,而malloc不初始化,里邊數據是隨機的垃圾數據。
3realloc
void*realloc(void*mem_address,unsignedintnewsize);
功能
先判斷當前的指針是否有足夠的連續空間,如果有,擴大mem_address指向的地址,并且將mem_address返回,如果空間不夠,先按照newsize指定的大小分配空間,將原有數據從頭到尾拷貝到新分配的內存區域,而后釋放原來mem_address所指內存區域(注意:原來指針是自動釋放,不需要使用free),同時返回新分配的內存區域的首地址。即重新分配存儲器塊的地址。
返回值
如果重新分配成功則返回指向被分配內存的指針,否則返回空指針NULL。
注意
當內存不再使用時,應使用free()函數將內存塊釋放。
memcopy函數用法
memcpy是memorycopy的縮寫,意為內存復制,在寫C語言程序的時候,我們常常會用到它。它的函原型如下:
void*memcpy(void*dest,constvoid*src,size_tn);
它的功能是從src的開始位置拷貝n個字節的數據到dest。如果dest存在數據,將會被覆蓋。memcpy函數的返回值是dest的指針。memcpy函數定義在string.h頭文件里。
例子
1.將一個字符串數據復制到一塊內存。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#defineN10
intmain(void)
{
char*target=(char*)malloc(sizeof(char)*N);
memcpy(target,"0123456789",sizeof(char)*N);
puts(target);
free(target);
return0;
}
編譯,運行,將輸出:0123456789
END,本文到此結束,如果可以幫助到大家,還望關注本站哦!