簡體   English   中英

是否應該將指針傳遞給free()指向已分配空間的開頭?

[英]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函數調用中使用這個新指針。 是對的嗎?

您有以下選擇:

  1. 保留原始變量並使用副本指向malloc ed數據的不同位置。 使用原始變量free呼叫。

  2. 制作副本,使用原始變量指向malloc ed數據的不同位置。 使用副本free撥打電話

  3. 保留原始指針。 使用索引訪問malloc ed數據的不同位置。 使用原始變量free呼叫。

不管你訪問返回的數據的不同位置的方式malloc ,這是由返回指針的值malloc必須調用來free

是的,您的理解和建議的解決方案是正確的。 而且,根據C11標准,

7.22.3.3 free功能

...如果參數與先前由內存管理函數返回的指針不匹配,或者如果通過調用freerealloc釋放了空間,則行為未定義

所以試圖在你分配的內存中間某處free會導致未定義的行為,並可能會破壞你的程序。

根據第7.20.3.2章, c99標准,第2段[強調我的]

free函數導致ptr指向的空間被釋放,即可用於進一步分配。 如果ptr是空指針,則不執行任何操作。 否則, 如果參數與之前由callocmallocrealloc函數返回的指針不匹配,或者如果通過調用freerealloc釋放了空間, 則行為未定義。

因此,您無法將指針傳遞給malloc()或family不返回的free() 你說得對。

為了完成你的工作,在開始時,你要復制malloc()返回的原始指針,一旦你完成了使用內存,你需要用之前存儲的值調用free()

是。 你明白了。 ptr被更改為指向不同的位置時,調用free將將malloc分配的malloc不會被釋放。
您需要保留返回指針的副本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM