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