[英]Should the pointer being passed to free() point to the start of the allocated space?
假設我使用malloc
請求一個可用空間。 變量ptr
指向創建的內存空間。 在我的代碼中, ptr
的值被更改為訪問我分配的空間中的不同位置。
在ptr
改變之后調用free(ptr)
是不正確的,不是嗎? 我應該做的是在malloc
之后創建一個ptr
的副本。 應該在free
函數調用中使用這個新指針。 是對的嗎?
干杯
在
ptr
改變之后調用free(ptr)
是不正確的,不是嗎?
這是正確的理解。 這不正確。
我應該做的是在
malloc
之后創建一個ptr
的副本。 應該在free
函數調用中使用這個新指針。 是對的嗎?
您有以下選擇:
保留原始變量並使用副本指向malloc
ed數據的不同位置。 使用原始變量free
呼叫。
制作副本,使用原始變量指向malloc
ed數據的不同位置。 使用副本free
撥打電話
保留原始指針。 使用索引訪問malloc
ed數據的不同位置。 使用原始變量free
呼叫。
不管你訪問返回的數據的不同位置的方式malloc
,這是由返回指針的值malloc
必須調用來free
。
是的,您的理解和建議的解決方案是正確的。 而且,根據C11標准,
7.22.3.3
free
功能...如果參數與先前由內存管理函數返回的指針不匹配,或者如果通過調用
free
或realloc
釋放了空間,則行為未定義
所以試圖在你分配的內存中間某處free
會導致未定義的行為,並可能會破壞你的程序。
根據第7.20.3.2章, c99
標准,第2段[強調我的]
free
函數導致ptr
指向的空間被釋放,即可用於進一步分配。 如果ptr
是空指針,則不執行任何操作。 否則, 如果參數與之前由calloc
,malloc
或realloc
函數返回的指針不匹配,或者如果通過調用free
或realloc
釋放了空間, 則行為未定義。
因此,您無法將指針傳遞給malloc()
或family不返回的free()
。 你說得對。
為了完成你的工作,在開始時,你要復制malloc()
返回的原始指針,一旦你完成了使用內存,你需要用之前存儲的值調用free()
。
是。 你明白了。 當ptr
被更改為指向不同的位置時,調用free
將將malloc
分配的malloc
不會被釋放。
您需要保留返回指針的副本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.