【问题标题】:C realloc not changing apparent size of character arrayC realloc 不会改变字符数组的表观大小
【发布时间】: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'd characters。
  • @sredmond:没有这样的功能。您只需要记住分配内存时请求的大小即可。
  • realloc 释放 characters?太棒了!

标签: c arrays pointers memory-management realloc


【解决方案1】:

没有办法找到alloc/realloc分配的实际大小。将characters 的大小除以*characters 的大小的技巧仅适用于数组;它确实不适用于指针。

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

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

【讨论】:

  • 我通常在使用 realloc 时存储(项目数)和(指向项目的指针),而不是分配的大小。对我来说看起来更具可读性。如果你不想一直重新分配,你通常会分配比现在需要的多一点,所以如果你需要一个更多的项目,你就不需要重新分配。在这种情况下,您有一个三元组(分配了多少项,使用了多少项,指向已分配项的指针)。
【解决方案2】:

您不能在指针上使用 sizeof 来获取分配的内存量。

char* characters = (char *) malloc(10 * sizeof(char));

characters 变量不知道它指向多少空间。跟踪它是你的工作。

至于

char* temp = (char *) realloc(characters, 100);

realloc 可以移动内存块——这就是这里发生的事情。当它这样做时,它将最初由字符指向的内存标记为未分配。因此,当您释放最后一行的字符时,您会收到错误消息,因为您正在释放系统标记为未分配的内存。

【讨论】:

  • 可以,但是指针的大小(在 32 位系统上为 4)不是 OP 所需要的。
  • 是的。似乎我无法获得已分配 char* 的空间长度。我能得到的最接近的是strlen,但这只会给出连续字符序列中任何以空字符结尾的字符串的长度
猜你喜欢
  • 2012-10-01
  • 2015-04-03
  • 1970-01-01
  • 2015-06-06
  • 2016-03-27
  • 1970-01-01
  • 2020-03-27
  • 2019-11-06
  • 2017-08-24
相关资源
最近更新 更多