c-为什么realloc()在多次调用时会在动态数组中引入一些随机值



我正在尝试使用for循环填充动态生成的数组,并在需要时使用realloc((使其变大。然而,当在内存上多次调用realloc时,它会用看似随机的数字替换一些值,尤其是前几个和后几个。

这是我测试的代码说:

#include <stdio.h>
#include <stdlib.h>
void fill(int * array, int size, int number_of_values) {
for (int i = 0; i < number_of_values; i++) {
if (i == size) {
size *= 2;
array = realloc(array, sizeof(int) * size);
}
array[i] = 100;
}
}
int main() {
int *array;
int number_of_values = 21;
int size = 5;
array = malloc(sizeof(int) * size);
fill(array, size, number_of_values);
for (int i = 0; i < number_of_values; i++) {
printf("%i ", array[i]);
}
}

我多次尝试重新实现代码,并在将100分配给数组后直接查看数组,但最初所有值都被正确分配,然后以某种方式更改。我还观察到,只有当循环中有20多个项目分配给数组时,才会出现上述行为。

程序的输出通常看起来像这样:

10425976 10436440 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 134217736

而当我将number_of_values设置为20,因此只分配20个值时,输出如下所示:

100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100

我还查阅了realloc函数的一些参考资料,但就我而言,我正确地使用了它。

问题是函数必须返回新分配的数组。

int* fill(int * array, int size, int number_of_values) {
...
return array;
}
int main() {
...
array = fill(array, size, number_of_values);
,,,
}

初学者通常会因为以下几个原因而犯错。他们可能认为,因为mainfind中名为array的两个变量都有相同的名称,所以它们是同一个变量。这不是真的。

另一个原因是,有时初学者认为指针有一些特别之处。如果以某种方式更改函数内部的指针,它也会更改调用函数中相应的指针。我认为这是一种误解,因为您可以使用指针来更改指向的值,但指针本身与任何其他类型的变量具有相同的规则。

最新更新