Какой именно способ освободить память в этом случае; есть ли разница между этими двумя методами?
Оба метода верны.
Однако я предпочту использовать функцию int* allocateArray2(int size, int value)
, которая выделяет некоторую память из кучи внутри функции и возвращает указатель на выделенное пространство памяти. Основная причина, по которой требуется malloc, - это когда у вас есть данные, которые должны иметь срок службы, отличный от области кода. Ваш код вызывает malloc в одной подпрограмме, где-то хранит указатель и в конечном итоге вызывает вызов в другой процедуре.
void allocateArray1(int size, int value)
Функция, которая запрашивает некоторую память, выполняет некоторую обработку и освобождает память перед возвратом, не является эффективным методом, если size
меньше. Вместо этого вы можете создать массив в стеке и использовать его для дальнейшей обработки. Преимущество использования стека для хранения переменных - это то, что память управляется для вас. Вам не нужно выделять память вручную или освобождать ее, как только она вам больше не понадобится. Более того, поскольку процессор так эффективно организует стекную память, чтение и запись в стек переменных очень быстро. Однако это может привести к переполнению стека, если вы попытаетесь выделить больше памяти в стеке, чем это подходит, например, создав слишком большие переменные массива.
Пример очень большой переменной стека в C:
int foo()
{
double x[1048576];
}
Заявленная массив потребляет 8 Mebibytes данных (предполагается, что каждый двойной 8 байт); если это больше памяти, чем доступно в стеке (в соответствии с параметрами создания потока или ограничениями операционной системы) произойдет переполнение стека.
Очевидно, что есть разница. В 'allocateArray1()' ваша функция 'main()' никогда не видит или не знает о массиве и поэтому ничего не может с этим поделать. Используйте этот метод, когда это именно то, чего вы хотите, чтобы 'main()' быть не в состоянии сделать. –
Обратите внимание, что 'malloc' и' free' * не заботятся о том, как работают * ваши * функции. Все, о чем они заботятся, это то, что память, выделенная с помощью 'malloc', в конечном итоге освобождается с помощью' free'. – immibis
не имеет значения, какой из них вы выберете, если 'main' не имеет никакого бизнес-обмена с выделенной вами памятью, просто выделите и освободите его в рамках вызываемой функции. –