malloc和relloc函式都需要標頭檔案 .
malloc函式模型:void *malloc(size_t size);
malloc 會在堆上分配連續的空間。堆中空間沒用名字,只能用指標使用。malloc函式返回的值沒有型別(void*),需要按照開闢的需求強制轉換成相應的型別。
用free()函式來釋放malloc開闢的空間,free操作僅僅是釋放堆上空間的使用權,並不會改變接受malloc返回位址的指標的指向。
同一塊記憶體空間不能被多出釋放。當釋放完空間後,一定要將指標(p)設為null。再操作 free(p) 時,編譯器不在報錯。
原因:在進入free函式時,函式內部會先判斷p的值,p=null直接返回,不繼續執行free函式裡面的操作命令.
例項:
#include #include int main()
printf ("%p\n", p);//設輸出p = 0x2000
free(p);
// free(p)--二次釋放報錯
printf ("%p\n", p); //p = 0x2000
// 當釋放完空間以後,一定要將指標設為null
p = null;
//不再報錯
free(p);
free(p);
return 0;
}
relloc
relloc()函式用來更改已經配置的空間。
擴大一塊記憶體時,realloc()試圖直接從堆上當前記憶體段後面的位元組中獲取更多的記憶體空間,如果滿足則返回原指標。當後面的內
存不夠時,則在堆上找到第乙個能滿足記憶體要求的記憶體塊,將目前的資料複製到新的位置,將原先的資料塊釋放,返回新的位址。
如果剩餘記憶體不足,重新申請空間失敗,則返回null。
在接受relloc的返回值時需要乙個新的指標變數來接受,不能用原先的指標接受新位址。如果重申失敗,原指標接受為null,realloc失敗原資料塊沒有釋放,原先記憶體發生記憶體洩漏, 如果繼續對原指標進行操作則會崩潰。(不能對null進行任何操作)
例項
int main()
// p = (int *)realloc(p, sizeof(int)*20);錯誤:原指標接受relloc的返回值
int *tmp = (int *)realloc(p, sizeof(int)*20);
if (tmp == null)
p = tmp;
printf ("p = %p, tmp = %p\n", p, tmp);
return 0;
}
malloc 和relloc 函式的區別與用法
malloc malloc 函式有乙個引數,即要分配的記憶體空間的大小 void malloc size t size calloc 函式有兩個引數,分別為元素的數目和每個元素的大小,這兩個引數的乘積就是要分配的記憶體空間的大小 void calloc size t numelements,size...
calloc 函式和malloc 函式
calloc 配置記憶體空間 malloc,free,realloc,brk include void calloc size t nmemb,size t size calloc 用來配置nmemb個相鄰的記憶體單位,每一單位的大小為size,並返回指向第乙個元素的指標。這和使用下列的方式效果相同...
malloc函式和free函式
c語言中的動態記憶體分配函式malloc和free使用起來很靈活,但是也很容易導致錯誤,如果知道了malloc和free的實現原理,那麼,出錯的機會就很小了。malloc的實現原理 作業系統維護了乙個將可用的記憶體塊連線為乙個長長的列表的所謂空閒鍊錶。呼叫malloc函式時,作業系統沿鍊錶尋找乙個大...