什么';realloc怎么了?
开始学习C中的malloc.h。其想法是创建动态数组。代码如下:什么';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
#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 ) );