2012-07-12 170 views
0

當我嘗試使用reallocfree'd指針分配內存時,出現分段錯誤。儘管如果我使用malloc代替,我不會遇到此問題。已釋放指針的realloc內存?

根據我的理解,變量已被free'd相當於一個NULL指針,那麼爲什麼這種意外的行爲呢?我錯過了什麼嗎?

回答

3

根據我的理解,變量已經free'd後,它相當於一個NULL指針。

A NULL指針是一個指針,它的值是NULL;像realloc這樣的標準函數知道如何解釋這個值。

指向某些已釋放內存的指針現在是無效指針;其價值不會改變。 realloc不知道它是無效的,並且會嘗試訪問它,導致seg-fault。

3

指針已被free'd爲而不是相當於NULL指針。在調用free之後,您需要自己將指針設置爲NULL

如果你傳遞一個指針reallocfree倒是,但不是明確設置爲NULL,你可能通過realloc無效地址,它會嘗試使用,導致不確定的行爲,因此你的段錯誤。

+0

你錯了,如果傳遞給realloc的指針是null,它就等價於malloc。看看手冊。 – Maresh 2012-07-12 15:35:40

+0

@Maresh natch,編輯 – pb2q 2012-07-12 15:40:41

+0

好吧,下降刪除:) – Maresh 2012-07-12 15:41:50

0

否,free'd指針不等於空指針。 free不會修改傳入的指針,因此指針會繼續指向相同的內存位置,即現在未分配的內存。

如果你嘗試realloc它然後內存分配器會混淆和腐敗其內部結構,這就是爲什麼你得到一個段錯誤。

3

free()不會將指針設置爲0,您必須自己動手。

如果傳遞給realloc的指針爲null,它將爲你自己malloc。

0

這從從Debian Linux機器應該告訴你所有你需要知道的人的realloc(3) - 基本上不使用免費的realloc()

realloc()的前更改內存的大小由ptr指向的塊指向 大小字節。內容將保持原來和新尺寸的最低 ;新分配的內存將被初始化。如果 ptr爲NULL,那麼調用等價於malloc(size),對於所有 值的大小;如果size等於零,並且ptr不爲NULL,那麼調用相當於free(ptr)。除非ptr爲NULL,否則必須先通過調用malloc(),calloc()或 realloc()返回 。如果指向的區域被移動,則完成一個空閒(ptr)。

0

你傳遞到realloc指針必須是兩件事情之一:要麼先前從malloc/calloc/realloc返回一個有效的指針,否則空指針。

如果釋放內存,則需要將指針設置爲NULL,然後再次將其傳遞到reallocfree不會將指針設置爲NULL(也不會以任何其他方式修改指針本身 - 它不能因爲它接收到指針的副本,而不是指針本身)。