2014-01-26 44 views
1

我有下面的代碼:ReAlloc如果根本就沒有diong什麼,不示數

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main(int argc, char ** argv) 
{ 
    //just checking to see where the stack 
    printf("The stack is around %p\n", &argc); is, making sure arr isn't in it 
    char ** arr = malloc(8*sizeof(char*)); 
    printf("arr is size %li, at %p\n", sizeof(arr), arr); 
    arr = realloc(arr, 100); //I picked a weird number to show it isn't doing anything. I've picked different numbers (like 200, 2*sizeof(char*)*sizeof(arr), and 16) 
    printf("arr is size %li, at %p\n", sizeof(arr), arr); 
} 

這是該文件的全部內容(這是一個單元測試,我在別處注意到它)

輸出以上如下:

The stack is around 0x7fff5b94d12c 
arr is size 8, at 0x120f010 
arr is size 8, at 0x120f010 

也許我誤解了realloc應該做什麼。我期待以下輸出。

The stack is around 0x7fff5b94d12c 
arr is size 8, at 0x120f010 
arr is size <size>, at <somewhere> 

其中<size>是...一些奇怪的像12 ......至少不是8 <somewhere>是最有可能0x120f010但可能在任何地方合理。

我的期望是錯的還是我錯誤地使用了realloc?

+3

真正的問題是,你誤會'sizeof' ... –

+0

你說得對,我是。謝謝......現在來調試原來的程序。 –

回答

1

程序的輸出是正確的,因爲

  • 無論malloc也不realloc有什麼用自動存儲(即「堆棧」)。它們從動態存儲區(即「堆」)分配內存。人們不應該期望堆棧頂部的位置響應於調用malloc,realloc或者就此而言任何其他函數而改變。
  • sizeof(arr)的值不取決於您分配給它的值。它是在編譯時計算的,它總是等於指針的大小。在你的系統上,指針使用8個字節。
  • malloc通常會爲您提供更多內存,並將實際值存儲在realloc可以在以後訪問的特殊位置。如果您在realloc下降或realloc範圍內,realloc返回的值不會更改。這就是爲什麼它可能比簡單呼叫mallocmemcpy更好。
+0

感謝您的回答(我明顯發現它是最準確的,儘管Ed's也很棒)。關於堆棧與堆,我只是試圖確保我沒有錯誤地使用malloc,並用堆棧寫入其中的一部分。在原來的程序中,我收到了一些看起來像某些字符串被覆蓋的問題(他們是;我正在重新分配一個比必要的小得多的空間),所以這就是爲什麼那條線。 –

1
sizeof arr 

這是一個指針的大小是不會改變的,並採取了指針的大小是不會告訴你多少內存是指在相同

sizeof char** 

。指針不是數組,並且在編譯時評估sizeof

至於地址位,realloc不保證內存塊已被移動。它可以簡單地擴展它並返回相同的地址。

此外,我意識到這只是示例代碼,但請注意,如果realloc失敗,則會泄露原來指向的內容arr

+2

迂迴:在C99中,'sizeof'可以是一個運行時操作(如果用於可變長度數組)。看到http://stackoverflow.com/q/10078283/575615 – Medo42

+0

@ Medo42:啊,是的,很好的電話。我一直在C89的土地上寫C一段時間,沒有想到這一點。 –

0

的情況並不少見,事實上,有點期待,一個malloc呼叫直接跟着realloc不會改變指針的地址。在很多情況下,分配器只能擴展地址保留的內存量,而不必移動指針。這就是發生在這裏的事情。

這不是你應該永遠依賴的東西。這只是一個執行的怪癖

+0

這根本不是這個問題所關注的。 –

0

如果你的假設是realloc()必須返回一個不同的指針,那麼你的假設是錯誤的。

通常,如果你減少已分配內存的大小或離開它「原樣」,然後realloc()可以返回相同的指針和避免數據複製等

有時候,如果你增加的大小分配的內存realloc()可以檢查現有空間上方是否有空閒空間並仍然返回相同的指針(並避免複製數據)。

大多數情況下,只有在分配的內存上方沒有空閒空間時,realloc()必須將數據複製到其他位置並返回不同的指針。

相關問題