указатель на указатель, который указывает на блок памяти, какой указатель следует освободить?

В конце кода ниже, какой указатель мне нужно подключить к free(), array или temp_array? Имеет ли значение, какой из них или освободит блок памяти?

int *array = 0;
int *temp_array = 0;
int count = 0;

array = malloc(sizeof(int));

// skipping code where count is calculated...

temp_array = realloc(array, count * sizeof(int));

if (temp_array == NULL) {
    free(array);
    // some error message
    return;
}
array = temp_array;

// skipping section of code, which reads numbers from a file and loads them into an array
// amount of numbers read can be 0 to whatever

free (array); // free array or temp_array?

Кроме того, возможно ли выделить блок памяти с помощью realloc, если указатель, для которого он пытается выделить память, равен NULL (другими словами, мне нужно сначала выделить память с помощью malloc, а затем изменить ее размер с помощью realloc, или я могу пропустить маллок)?


person Aelin    schedule 23.06.2014    source источник


Ответы (1)


Это не имеет значения — и temp_array, и array указывают на один и тот же блок памяти. Я бы предпочел temp_array, так как тогда совпадают указатели realloc и free. В зависимости от вашего рабочего кода для защиты вы можете рассмотреть возможность присвоения обоим указателям значения NULL, чтобы предотвратить двойное освобождение памяти. free(NULL) безопасен - никакая операция не выполняется.

Что касается начального выделения одного целого числа - это необходимо? Судя по показанному коду, предпочтительнее использовать тип int, определенный в стеке.

EDIT: После получения дополнительной информации от OP (в комментариях) выясняется, что код можно упростить, используя значение заголовка, которое содержит количество записей в файле. Это устраняет необходимость в перераспределении и позволяет выделять память до чтения значений файла.

person suspectus    schedule 23.06.2014
comment
Я не уверен, что написал это наилучшим образом, но код взят из функции, которая считывает целые числа из файла и загружает их в массив. Количество целых чисел может быть от 0 до любого. Я сделал malloc вне цикла for, который перебирает числа в файле, а внутри цикла for я использую realloc для увеличения размера массива. Я не был уверен, можно ли выделить память по указателю NULL, поэтому я сначала вызвал malloc. Можно ли выделить память с помощью realloc, если указатель равен NULL? т.е. ptr = realloc (NULL, count * sizeof(int)); - person Aelin; 23.06.2014
comment
Ok. Я бы создал заголовок в файле, содержащий количество записей. Затем функция сначала прочитает заголовок int, выделит достаточно памяти, а затем прочитает все значения. - person suspectus; 23.06.2014
comment
отличная идея!! не думал об этом. - person Aelin; 23.06.2014
comment
хорошо - я обновлю ответ через минуту. Кстати, пожалуйста, проголосуйте или примите ответ, если это поможет. Спасибо :) - person suspectus; 23.06.2014