2015-11-28 69 views
-2

假設我已經分配了足夠大的char**數組。C中的空閒分配內存

爲什麼我可以做free(arr)但不是free(arr + 5)

請注意,我不是在談論arr[0]arr[5]

+0

主要是因爲標準這麼說。出於更多技術原因,一些'malloc()'實現在分配的內存區域之前放置了簿記數據。除了指針'malloc()'以外的其他內容傳遞給'free()'會導致'free()'將垃圾數據解釋爲其簿記數據,並帶來致命後果。 – fuz

+0

謝謝,我現在明白了。 – W2a

回答

0

malloc(3)不能這樣工作。它在內存中分配固定大小的數據塊,在塊的開始處添加元數據(如下一個空閒塊的地址或塊的大小),並在元數據之後返回地址。

Malloc

free(3)需要包含在要執行的元數據信息(例如,以更新其鏈接列表中的空閒塊的地址。如果您提供的沒有被malloc(3)分配的指針,元數據是不存在,free是無法做到這一點。

出於這個原因,free(3)手冊頁明確地禁止通過,並沒有被'的malloc分配的指針(3)

free()函數釋放內存空間由ptr,必須已返回由以前調用malloc()calloc(),或realloc()指出。否則,或者如果已經調用free(ptr)之前已經調用了 ,則會發生未定義的行爲。如果ptrNULL, 不執行操作。

否則可能導致未定義行爲,即,如果你的系統還沒有把一些防護措施是爲了防止你這樣做,可能會導致安全漏洞,因爲free(3)上的任意內存寫假元數據指向的區域。

+1

謝謝,我現在明白了。 – W2a

+1

然後請標記解決您的問題的答案! –

2

您總是使用由malloc()realloc()calloc()返回的指針調用free()。你不能傳遞任何其他的指針。

free()手冊:

自由()函數釋放內存空間由PTR,其 必須已返回由先前調用的malloc(),釋放calloc(),或 指向realloc的()。否則,或者如果自由(ptr)之前已被稱爲 ,則會發生未定義的行爲。如果ptr爲NULL,則不執行 。

+2

不應該在「一定不要」。 – fuz

+0

謝謝,我現在明白了。 – W2a

+0

@FUZxxl的確。謝謝。 –