當我嘗試使用realloc
爲free
'd指針分配內存時,出現分段錯誤。儘管如果我使用malloc
代替,我不會遇到此問題。已釋放指針的realloc內存?
根據我的理解,變量已被free
'd相當於一個NULL
指針,那麼爲什麼這種意外的行爲呢?我錯過了什麼嗎?
當我嘗試使用realloc
爲free
'd指針分配內存時,出現分段錯誤。儘管如果我使用malloc
代替,我不會遇到此問題。已釋放指針的realloc內存?
根據我的理解,變量已被free
'd相當於一個NULL
指針,那麼爲什麼這種意外的行爲呢?我錯過了什麼嗎?
根據我的理解,變量已經free'd後,它相當於一個NULL指針。
A NULL
指針是一個指針,它的值是NULL
;像realloc
這樣的標準函數知道如何解釋這個值。
指向某些已釋放內存的指針現在是無效指針;其價值不會改變。 realloc
不知道它是無效的,並且會嘗試訪問它,導致seg-fault。
指針已被free
'd爲而不是相當於NULL
指針。在調用free
之後,您需要自己將指針設置爲NULL
。
如果你傳遞一個指針realloc
已free
倒是,但不是明確設置爲NULL
,你可能通過realloc
無效地址,它會嘗試使用,導致不確定的行爲,因此你的段錯誤。
否,free
'd指針不等於空指針。 free
不會修改傳入的指針,因此指針會繼續指向相同的內存位置,即現在未分配的內存。
如果你嘗試realloc
它然後內存分配器會混淆和腐敗其內部結構,這就是爲什麼你得到一個段錯誤。
否free()
不會將指針設置爲0,您必須自己動手。
如果傳遞給realloc的指針爲null,它將爲你自己malloc。
這從從Debian Linux機器應該告訴你所有你需要知道的人的realloc(3) - 基本上不使用免費的realloc()
realloc()的前更改內存的大小由ptr指向的塊指向 大小字節。內容將保持原來和新尺寸的最低 ;新分配的內存將被初始化。如果 ptr爲NULL,那麼調用等價於malloc(size),對於所有 值的大小;如果size等於零,並且ptr不爲NULL,那麼調用相當於free(ptr)。除非ptr爲NULL,否則必須先通過調用malloc(),calloc()或 realloc()返回 。如果指向的區域被移動,則完成一個空閒(ptr)。
你傳遞到realloc
指針必須是兩件事情之一:要麼先前從malloc
/calloc
/realloc
返回一個有效的指針,否則空指針。
如果釋放內存,則需要將指針設置爲NULL,然後再次將其傳遞到realloc
。 free
不會將指針設置爲NULL(也不會以任何其他方式修改指針本身 - 它不能因爲它接收到指針的副本,而不是指針本身)。
你錯了,如果傳遞給realloc的指針是null,它就等價於malloc。看看手冊。 – Maresh 2012-07-12 15:35:40
@Maresh natch,編輯 – pb2q 2012-07-12 15:40:41
好吧,下降刪除:) – Maresh 2012-07-12 15:41:50