2014-03-06 66 views
0

當我運行下面的代碼時,我得到了給定的輸出。C realloc不改變字符數組的表觀大小

#include <stdio.h> /* printf */ 
#include <stdlib.h> /* malloc, realloc */ 

int main() 
{ 
    char* characters = (char *) malloc(10 * sizeof(char)); 
    printf("Before: characters at %p, size=%lu\n", (void *) characters, sizeof(characters)/sizeof(characters[0])); 
    char* temp = (char *) realloc(characters, 100); 
    if (temp) 
    { 
     printf("After realloc, characters size = %lu, temp size = %lu\n", sizeof(characters)/sizeof(characters[0]), sizeof(temp)/sizeof(temp[0])); 
     printf("After realloc, nums at %p, temp at %p\n", (void *) characters, (void *) temp); 
     //characters = temp; 
     free(temp); 
    } 
    free(characters); 
} 

/* Output: 
Before: characters at 0x107b00900, size=8 
After realloc, characters size = 8, temp size = 8 
After realloc, nums at 0x107b00900, temp at 0x107b00910 
test(3556) malloc: *** error for object 0x107b00900: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 
Abort trap: 6 
*/ 

我想弄清楚什麼是故障。 我認爲malloc爲十個連續字符留出了空間,並給了我一個指向該數組第一個元素的指針,並將該指針存儲在characters中。然後我打印characters的大小,我期望10,但我得到8。這是第一個奇怪的事情。然後,我要求realloc在堆中找到一個新點,它有100個連續字符的空間並返回給我一個指向第一個點的指針。我把那個指針放到了temp中。當我打印temp的大小時,即使我期望100,我也會得到8(再次)。當我打印指針characterstemp時,我在堆中得到兩個不同的位置。通常,我會重新指定characters指針指向temp指向的任何地方。然後我試圖釋放我的指針,它告訴我它不能釋放0x107b00900,確切位置characters是,因爲那時的對象不是malloc ed;不過,我爲characters做了malloc的空間。這是爲什麼發生?我是否誤解了mallocreallocsizeof或其他的功能?感謝您的幫助。

+0

你不能在像這樣的指針上使用sizeof。你可以解放mem 2x。 –

+0

我可以使用什麼函數來獲取指針指向的數組大小? 'temp'和'characters'在不同的地方,對吧?那麼我在哪裏雙重釋放? – sredmond

+2

@sredmond。沒有,需要自己跟蹤分配的大小。如果成功,應該將'else free(characters)'作爲'realloc()'free'd'characters'。 – chux

回答

3

您不能在指針上使用sizeof來獲取分配的內存量。

char* characters = (char *) malloc(10 * sizeof(char)); 

characters變量不知道它指向多少空間。跟蹤它是你的工作。

至於

char* temp = (char *) realloc(characters, 100); 

的realloc可以移動的內存塊 - 這是在這裏發生了什麼。當它這樣做時,它將最初由字符指向的內存標記爲未分配。因此,當您在最後一行釋放字符時,會出現錯誤,因爲您釋放了系統標記爲未分配的內存。

+3

當然可以。它只是給你指針的大小。 –

+0

好的。你是對的。我應該重新說, –

+0

是的,你可以,但指針的大小(32位系統上的4)不是OP所需要的。 –

3

無法找到由alloc/realloc分配的實際尺寸。將characters大小除以*characters大小的技巧僅適用於數組;它確實不是工作指針。

庫不會以標準庫的用戶可用的方式跟蹤分配的內存塊的大小。它可能會存儲一些信息供自己使用,但沒有面向用戶的呼叫來檢索它。

解決此問題的常用方法是將分配的大小與指向分配區域的指針一起存儲。

+0

好的,謝謝!這是我需要知道的。 – sredmond

+0

我通常使用realloc存儲(項目數量)和(指向項目的指針),而不是分配的大小。看起來對我更可讀。如果你不想重新分配所有的時間,你通常會分配一些比現在需要的更多,所以如果你需要一個項目,你不需要重新分配。在這種情況下,你有三重(分配的項目數量,使用的項目數量,分配項目的指針)。 – gnasher729