當我運行下面的代碼時,我得到了給定的輸出。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(再次)。當我打印指針characters
和temp
時,我在堆中得到兩個不同的位置。通常,我會重新指定characters
指針指向temp
指向的任何地方。然後我試圖釋放我的指針,它告訴我它不能釋放0x107b00900
,確切位置characters
是,因爲那時的對象不是malloc
ed;不過,我爲characters
做了malloc
的空間。這是爲什麼發生?我是否誤解了malloc
,realloc
,sizeof
或其他的功能?感謝您的幫助。
你不能在像這樣的指針上使用sizeof。你可以解放mem 2x。 –
我可以使用什麼函數來獲取指針指向的數組大小? 'temp'和'characters'在不同的地方,對吧?那麼我在哪裏雙重釋放? – sredmond
@sredmond。沒有,需要自己跟蹤分配的大小。如果成功,應該將'else free(characters)'作爲'realloc()'free'd'characters'。 – chux