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

问题描述 投票:0回答:1

我正在尝试使用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函数的一些引用,但是就我而言,我正确地使用了它。

c malloc dynamic-memory-allocation realloc
1个回答
0
投票

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

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

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

初学者通常会由于以下几个原因而犯错。他们可能会认为,由于arraymain中的两个变量find都具有相同的名称,因此它们是相同的变量。这是不正确的。

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

© www.soinside.com 2019 - 2024. All rights reserved.