Можно ли освободить отдельные адреса памяти массива, выделенного динамически?
Если память находится в конце массива, вы можете освободить ненужный избыток, выполнив realloc
для меньшего размера, с оговоркой, что вы можете фактически получить новый указатель на новую память с содержимым префикса скопировано в него, и оригинальная память освобождена полностью.
В противном случае нет. Интерфейс free
определен так, чтобы принимать только адреса, возвращенные с malloc
, calloc
или realloc
.
Почему вы не можете освободить отдельные адреса, потому что пространство должно быть непрерывным?
Что ж, прямой ответ заключается в том, что для этого не определен интерфейс. Невозможно сказать free
, сколько указателя, который вы передали, должен быть освобожден. Если вы хотите освободить всю память до конца выделенного блока, realloc
сделает это.
Если смежность не важна для вашей программы, просто используйте отдельные выделения для каждого элемента массива и освобождайте их отдельно.
и если это ответ, то почему на жестких дисках происходит фрагментация
Один из способов представить сценарий фрагментации в файловой системе состоит в том, что если три файла создаются один за другим, а затем удаляется средний файл, между двумя файлами теперь есть дыра.
|---File 1---|--- Hole ---|---File 3---|
Теперь предположим, что создан новый файл, поэтому он начинается внутри отверстия между двумя файлами, но по мере роста он не может поместиться в отверстии, поэтому теперь остальная часть файла находится после File 3
. В этом случае мы бы сказали, что новый файл фрагментирован.
|---File 1---|---File 4...|---File 3---|...File 4---|
Это происходит на «жестких дисках», потому что файловая система спроектирована таким образом: позволяет большому файлу перекрывать доступные дыры на физическом носителе.
Диск RAM, используемый для файловой системы, также может в конечном итоге иметь фрагментированные файлы.
Несмежную структуру данных можно рассматривать как «фрагментированную», например, связанный список или дерево, но это предусмотрено проектом. Массив считается смежным по самому определению. Однако файлы в файловой системе не являются массивами.