Как 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 шт):
Решил тут написать про то, что узнал (прошу прощения, если где-то ошибаюсь).
Допустим мы выделили память "маллоком" под "интовый" массив длины 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. Конкретно часть про динамическую память.