在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);
calloc與malloc相似,引數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是乙個雙...