为什么 realloc() 在多次调用时会在动态数组中引入一些随机值?
Why is realloc() introducing some random values into a dynamic array when called multiple times?
我正在尝试使用 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
函数的参考资料,但就我而言,我正确地使用了它。
问题是你的函数必须return新分配的数组。
int* fill(int * array, int size, int number_of_values) {
...
return array;
}
int main() {
...
array = fill(array, size, number_of_values);
,,,
}
初学者通常会出于以下几个原因犯错。他们可能会认为,因为在 main
和 find
中称为 array
的两个变量具有相同的名称,所以它们是相同的变量。这不是真的。
另外一个原因就是有时候初学者会觉得指针有什么特别之处。如果您以某种方式更改函数内部的指针,它也会更改调用函数中的相应指针。我认为这是一种误解,因为您可以使用指针来更改指向的值,但指针本身与任何其他类型的变量具有相同的规则。
我正在尝试使用 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
函数的参考资料,但就我而言,我正确地使用了它。
问题是你的函数必须return新分配的数组。
int* fill(int * array, int size, int number_of_values) {
...
return array;
}
int main() {
...
array = fill(array, size, number_of_values);
,,,
}
初学者通常会出于以下几个原因犯错。他们可能会认为,因为在 main
和 find
中称为 array
的两个变量具有相同的名称,所以它们是相同的变量。这不是真的。
另外一个原因就是有时候初学者会觉得指针有什么特别之处。如果您以某种方式更改函数内部的指针,它也会更改调用函数中的相应指针。我认为这是一种误解,因为您可以使用指针来更改指向的值,但指针本身与任何其他类型的变量具有相同的规则。