c語言malloc和calloc使用心得

2022-09-01 12:30:14 字數 1827 閱讀 8628

在c 中區域性變數 靜態變數 形參的記憶體是棧記憶體 是編譯器分配的 而堆記憶體是用來儲存結構 物件等資訊

可以使用指標等操作 指標需要分配足夠的記憶體  使用malloc calloc等方法

而且返回來的記憶體是個指標也就是個陣列 使用指標 指標就會執行首位址

比如 c++中使用new 和delete來分配記憶體

char* c=new char[100];

delete c

realloc是給乙個已經分配了位址的指標重新分配空間,引數ptr為原有的空間位址,newsize是重新申請的位址長度

void* realloc(void* ptr, unsigned newsize);

malloc用於申請一段新的位址,引數size為需要記憶體空間的長度,如:

char* p;

p=(char*)malloc(20);

void* malloc(unsigned size);

callocmalloc相似,引數elsize 為申請位址的單位元素長度,nelem為元素個數,如:

char* p;

p=(char*)calloc(20, sizeof(char)); 

這個例子與上乙個效果相同

void* calloc(size_t nelem, size_t elsize);

都在stdlib.h函式庫內

情景1:

char *str="";   

//到這一句就報錯了 因為堆記憶體不夠

strcpy(str, "hellooooo");   

printf("string is %s/n", str); 

free(str);  

情景2:

char *str="";  

if ((str = (char*)malloc(1)) == null)

strcpy(str, "hellooooo");   

printf("string is %s/n", str); 

//在這裡報錯 因為空間只有1 hellooooo占用的空間明顯大於1 所以肯定是編譯器開啟的新空間 所以不是malloc的空間

//free只能釋放malloc 或者calloc建立的空間

//所以報錯

free(str);

情景3:

char *str="";  

if ((str = (char*)malloc(10)) == null)

str="hello";   

printf("string is %s/n", str); 

//在這裡報錯 因為=是指向的意思 str 重新指向了一段新的記憶體 不是malloc出來的

//free只能釋放malloc 或者calloc建立的空間

//所以報錯

free(str);

正確的寫法

char *str="";  

if ((str = (char*)malloc(10)) == null)

//大小為10的記憶體 不能放10個字元只能放9個 因為c還有個/0 表示結尾

strcpy(str, "hellooooo");   

printf("string is %s/n", str); 

free(str); 

當然 delete 也只能刪除new 關鍵字建立的記憶體 和malloc 上面的情景是一摸一樣的

C語言malloc函式

malloc 標頭檔案 include 原型 void malloc size t size 引數說明 size為需要分配的記憶體空間大小,單位是byte 函式說明 在堆區分配一塊size byte大小的記憶體空間,用於存放資料,這塊記憶體空間被分配後不會被初始化,因此這些記憶體空間對應的值是未知的...

C語言malloc和free實現原理

以下是一段簡單的c malloc和free到底做了什麼?int main malloc和free的debug和release版本實現各不相同,而且相差很大。malloc需要分配的記憶體會比實際的size多36byte。最終分配的記憶體塊如下 crtmemblockheader是乙個雙向鍊錶結構,其定...

C語言malloc和free實現原理

以下是一段簡單的c malloc和free到底做了什麼?int main malloc和free的debug和release版本實現各不相同,而且相差很大。debug版本 malloc需要分配的記憶體會比實際的size多36byte。最終分配的記憶體塊如下 crtmemblockheader是乙個雙...