【发布时间】:2014-04-09 10:17:48
【问题描述】:
当我运行下面的代码时,我得到了给定的输出。
#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 的大小时,我得到 8(再次),即使我期望 100。当我打印指向 characters 和 temp 的指针时,我在堆中得到两个不同的位置。通常,我会重新分配 characters 指针以指向 temp 所指向的任何内容。然后我试图释放我的指针,它告诉我它不能释放0x107b00900,确切的位置是characters,因为那个时候的对象不是malloced;但是,我为characters 做了malloc 空间。为什么会这样?我是否误解了malloc、realloc、sizeof 或其他的功能?感谢您的帮助。
【问题讨论】:
-
你不能在这样的指针上使用 sizeof。你释放内存 2 倍。
-
我可以使用什么函数来获取指针指向的数组的大小?
temp和characters在不同的地方,对吧?那么我在哪里双重释放? -
@sredmond。没有,需要自己跟踪分配的大小。如果成功,应该是
else free(characters)和realloc()free'dcharacters。 -
@sredmond:没有这样的功能。您只需要记住分配内存时请求的大小即可。
-
realloc释放characters?太棒了!
标签: c arrays pointers memory-management realloc