Почему reallo c () вводит некоторые случайные значения в динамический массив c при многократном вызове? - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь заполнить динамически сгенерированный массив, используя для l oop и увеличить его при необходимости, используя reallo c (). Однако, когда reallo c вызывается в памяти несколько раз, он заменяет некоторые значения, особенно первое и последнее, на кажущиеся случайными числами.

Это код, с которым я проверял сказанное:

#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, но все значения сначала назначаются правильно, а потом меняются как-то. Я также заметил, что такое поведение, по-видимому, происходит, только когда в l oop назначено более 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, но, насколько мне известно, я использовал ее правильно.

1 Ответ

0 голосов
/ 28 апреля 2020

Проблема в том, что ваша функция должна возвращать вновь выделенный массив.

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

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

Начинающие обычно ошибаются по нескольким причинам. Они могут подумать, что поскольку две переменные с именем array в main и в find имеют одинаковое имя, они являются одной и той же переменной. Это не так.

Другая причина в том, что иногда начинающие думают, что в указателях есть что-то особенное. Если вы как-то меняете указатель внутри функции, это также меняет соответствующий указатель в вызывающей функции. Я думаю, что это недоразумение, основанное на том факте, что вы можете использовать указатель для изменения значения , указывающего на , но сам указатель имеет те же правила, что и любой другой тип переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...