什么';realloc怎么了?

什么';realloc怎么了?,c,C,开始学习C中的malloc.h。其想法是创建动态数组。代码如下: #include <stdio.h> #include <conio.h> #include <malloc.h> int main() { int *array = (int*)malloc(sizeof(int)); int i, j, val; for (i = 0;; i++) { array = (int*)realloc(array, siz

开始学习C中的malloc.h。其想法是创建动态数组。代码如下:

#include <stdio.h>
#include <conio.h>
#include <malloc.h>

int main() {
    int *array = (int*)malloc(sizeof(int));
    int i, j, val;
    for (i = 0;; i++) {
        array = (int*)realloc(array, sizeof(int) + sizeof(*array));
        printf("Enter array[%d]=", i);
        scanf("%d", (array + i));
        if (*(array + i) == 0) break;
    }
    for (j = 0; j < i; j++) {
        printf("[%d] = %d\n", j, *(array + j));
    }
    getch();
    return 0;
}
每次,
=8
值都是随机的。我完全不知道为什么会发生这样的情况,那么出了什么问题?

sizeof(*array)
是否告诉您数组有多大。它告诉您一个int占用多少字节。因此,对realloc的每次调用只为两个int值分配内存。更改
realloc
调用以分配
sizeof(int)
所需的int数。

您可以在代码中定义未定义的行为。我想,这样做:

array=(int*)realloc(array,sizeof(int)+sizeof(*array));
您希望
sizeof(*array)
将返回整个数组的大小,对吗?但事实并非如此
sizeof
是在编译时计算的,执行
sizeof(*array)
实际上与
sizeof(int)
相同

因此,要使该数组可扩展,您需要有额外的变量,保存当前的元素数,并执行以下操作:

array=(int*)realloc(array, sizeof(int) + current_size_of_array * sizeof( int ) );
其中,当您实际添加一个以上元素时,的
数组的当前大小将在
的每个循环上递增。

sizeof(int)+sizeof(*array)

您认为
sizeof(*array)
是已经分配的字节数。你错了,
sizeof(*array)
是一个
int
的大小。因此,您的缓冲区溢出,最终导致了一个问题


在您询问之前,没有标准的方法可以获得已分配的大小。通常你需要为自己存储(或者C++中使用比用户代码更友好的界面,而不是<代码> MaloC/<代码>,比如<代码>矢量< /代码>)。在这种情况下,您不需要现有的大小,您可以从
i

计算出所需的新大小
malloc
分配的内存块大小是库已知的(
free
只需要指针),但没有可移植的方法来获取该数字。必须将当前大小存储在其他变量中,以便分配更多空间

sizeof(*array)
中,
sizeof
操作符只考虑表达式的类型,在您的情况下是
(*(int*))
,换句话说,与
sizeof(int)
相同

<>在C++中,记住动态数组中元素的数量,允许增加大小是由标准类<代码> STD::vector < /C> > .<
作为旁注,请记住
x=realloc(x,…)
是一个不好的习惯用法,因为在分配失败的情况下,指针
x
将被泄漏内存的
NULL
覆盖。

使用调试器逐行检查代码时会发生什么情况?您应该先了解
sizeof()
如何工作。提示:
*数组的数据类型是什么<代码>数组
是指向int的指针。是的,你完全正确。但是我刚刚用另一个编译器检查了我的代码,它工作了!这很奇怪…不管怎样,塔克斯解释一下@wingsofovnia——它之所以有效,正是因为它是未定义的行为,这意味着,任何事情都可能发生。
array=(int*)realloc(array, sizeof(int) + current_size_of_array * sizeof( int ) );