Подтвердить что ты не робот

Память и г-н Струт

Если у меня есть struct:

struct Rec
{
    uint16_t vals[500];
};


Rec * prec = malloc(sizeof(Rec));
//Rec * prec = (Rec *) malloc(sizeof(Rec)); This code was my original and is incorrect.
//                                          See Below for details.

// initialize everything in vals

Будет ли этот код достаточным для освобождения всей используемой памяти?

free(prec);

Или мне нужно free массив отдельно?

4b9b3361

Ответ 1

Этого будет достаточно.
Вы не выделяли массив отдельно, поэтому достаточно освободить выделенный указатель.

Следуйте правилу:
Вы должны вызывать только free по адресу, возвращенному вам malloc, и все остальное приведет к Undefined Поведение.

Литература:
c99 Стандарт: 7.20.3.2 Функция free

Сводка
   #include
void free (void * ptr);

Описание:
 Функция free вызывает освобождение пространства, на которое указывает ptr, то есть сделанное доступный для дальнейшего распределения. Если ptr является нулевым указателем, никаких действий не происходит. В противном случае, если аргумент не соответствует указателю, ранее возвращенному calloc, malloc, или realloc, или если пространство было освобождено вызовом free или realloc, поведение не определено.

Возвращает
 Функция free не возвращает значение.

Ответ 2

Используйте free только при использовании malloc (или указателя NULL)

Значение, оно будет автоматически освобождено при выходе.


Если у вас есть malloc ed для этого, тогда этого будет достаточно.

Ответ 3

В своих более ранних ответах теккнолаги и Альс оба правильны. Если вы попытаетесь выполнить этот фрагмент кода, это может помочь осветить происходящее.

// cc -o test test.c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

struct rec {
    uint16_t vals[500];
};

int main (int argc, char const *argv[])
{
    printf("struct rec is %ld bytes.\n", sizeof(struct rec));

    struct rec* rec_p = (struct rec*)malloc(sizeof(struct rec));
    free(rec_p);
}

При выполнении этого кода вы увидите:

struct rec is 1000 bytes.

Вы вызывали malloc только один раз. Этот вызов выделил все пространство, описанное в определении вашей структуры. Соответствующий free также освобождает всю эту память.

Ответ 4

Rec * prec = (Rec *) malloc(sizeof(Rec));

Спасибо за включение выделения в комментарии (я отредактировал его в вопросе, надеюсь, что все правильно).

Чтобы освободить память, выделенную с помощью malloc(3), вы используете free(3), как вы догадались.

Но обратите внимание, что вам не нужно использовать случай (Rec *) с malloc(3), если вы #include <stdlib.h>. Прототип функции, представленный в заголовке, позволяет компилятору выяснить, что вы делаете. Включите заголовок и удалите бросок.