Как realloc() освобождает память?

int len = 5;
double* array = malloc(sizeof(double) * len);

for (int i = 0; i < len; i += 1)
{
    array[i] = i;
}

len -= 2;
array = realloc(array, sizeof(double) * len);

for (int i = 0; i < len + 2; i += 1)
{
    printf("%.1f ", array[i]);
}

Как известно, free() очищает память и позволяет использовать её снова. Что делает realloc() в моём примере? Он не очищает ячейки памяти под бывшие индексы 3 и 4 массива (видно из вывода), но даёт ли он возможность использовать эти ячейки для других программ, как это делает free() ?

P.S. И как мне очистить выше названные ячейки: просто присвоить, например, 0?


Ответы (1 шт):

Автор решения: dispensary

Решил тут написать про то, что узнал (прошу прощения, если где-то ошибаюсь).

Допустим мы выделили память "маллоком" под "интовый" массив длины 3. Его ячейки условно: 100, 104, 108. При уменьшении выделяемой памяти (допустим длина стала 2), доступные нам ячейки таковы: 100, 104.

108 же отправляется в "свободное плавание", т.е. будет доступна под другие нужды программы. При увеличении выделяемой памяти (допустим длина стала 4), доступные нам ячейки могут быть таковы: 100, 104, 108, 112 - ЕСЛИ ЕСТЬ ВОЗМОЖНОСТЬ РАСШИРИТЬСЯ ИМЕННО ТАК, т.е. 112 доступна. Если же 112 не доступна, то realloc() может перенести начальный адрес на ДРУГОЙ, т.е. доступные нам ячейки могут стать такими: 600, 604, 608, 612.

100, 104, 108 отправятся в "свободное плавание". ПРИЧЕМ, данные ячеек, которые отправляются восвояси, могут быть не удалены (зависит от компилятора).

З.Ы. Помогло видео - https://www.youtube.com/watch?v=zuegQmMdy8M&t=12533s. Конкретно часть про динамическую память.

→ Ссылка