当我运行以下代码时,我得到了给定的输出。
#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
,因为此时的对象不是malloc
;但是,我为malloc
做了characters
空间。为什么会这样?我是否误解了malloc
,realloc
,sizeof
或其他内容的功能?谢谢你的帮助。
答案 0 :(得分:3)
您不能在指针上使用sizeof来获取分配的内存量。
char* characters = (char *) malloc(10 * sizeof(char));
characters
变量不知道它指向的空间大小。跟踪它是你的工作。
至于
char* temp = (char *) realloc(characters, 100);
realloc可以移动内存块 - 这就是这里发生的事情。当它这样做时,它将字符最初指向的内存标记为未分配。因此,当您在最后一行释放字符时,会出现错误,因为您释放了系统标记为未分配的内存。
答案 1 :(得分:3)
无法找到alloc
/ realloc
分配的实际尺寸。将characters
的大小除以*characters
的大小的技巧仅适用于数组;它不用于指针。
库不会以标准库用户可用的方式跟踪分配的内存块的大小。它可以存储一些信息供自己使用,但是没有面向用户的调用来检索它。
解决此问题的常用方法是将分配的大小与指向分配区域的指针一起存储。