Ç的realloc不改变字符数组的表观大小(C realloc not changing appar

2019-11-03 01:32发布

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

#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指向。 然后我试图释放我的指针,它告诉我,现在还不能自由0x107b00900 ,确切位置characters是,因为在这一点上的目的不malloc编辑; 然而,我malloc空间characters 。 这究竟是为什么? 我误解的功能mallocreallocsizeof ,还是其他什么东西? 谢谢您的帮助。

Answer 1:

有没有办法找到根据所分配的实际尺寸alloc / realloc 。 与分割的大小的特技characters通过的大小*characters仅适用于阵列; 它为指针工作。

图书馆不保留的方式,将提供给标准库的用户跟踪分配的存储块的大小。 它可以存储供自己使用的一些信息,但没有面向用户的调用来检索它。

解决此问题的工作的一种常见方法是将分配的大小存储与指向分配区域一起。



Answer 2:

你不能使用你的指针的sizeof获得分配的内存量。

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

characters变量不知道这是多大的空间指向。 这是你的工作,以保持它的轨道。

据,直到...为止

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

realloc的可以移动的内存块 - 这是在这里发生了什么。 当它认为它标志着内存最初由字符作为未分配的指向。 因此,当你自由的字符在最后一行,你是因为你释放内存,该系统已标记为未分配得到一个错误。



文章来源: C realloc not changing apparent size of character array