gpt4 book ai didi

C realloc不改变字符数组的表观大小

转载 作者:太空宇宙 更新时间:2023-11-04 05:39:42 24 4
gpt4 key购买 nike

当我运行下面的代码时,我得到了给定的输出。

#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 的大小时,我得到 8(再次),即使我期望 100。当我打印指向 characterstemp,我在堆中得到了两个不同的位置。通常,我会重新分配 characters 指针以指向 temp 指向的任何内容。然后我试图释放我的指针,它告诉我它不能释放 0x107b00900characters 的确切位置,因为此时的对象不是 malloced;然而,我为字符做了malloc空间。为什么会这样?我是否误解了 mallocreallocsizeof 或其他功能?感谢您的帮助。

最佳答案

无法找到 alloc/realloc 分配的实际大小。将 characters 的大小除以 *characters 的大小的技巧仅适用于数组;它对指针起作用。

库不会以标准库用户可用的方式跟踪分配的内存块的大小。它可能会存储一些信息供自己使用,但没有面向用户的调用来检索它。

解决此问题的常用方法是存储分配的大小以及指向已分配区域的指针。

关于C realloc不改变字符数组的表观大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22230247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com