Освободить указатель на структуру, которая привела бы к зависанию программы - PullRequest
0 голосов
/ 24 августа 2018

с учетом следующего кода C:

struct list_element
{
    struct list_element * next;
};
typedef struct list_element list_element;

typedef struct
{
    list_element header;
    int value;

} *apple;

apple a = malloc(sizeof(apple));
a->value = 1;
free(a);

Однако программа «зависает» в функции free() (в конфигурации выпуска происходит сбой программы).Я также попытался free(&a) освободить платье, на котором находится указатель, но, похоже, ничего не работает.

Что я делаю не так?

1 Ответ

0 голосов
/ 24 августа 2018
apple a = malloc(sizeof(apple));

Распределит память по размеру указателя, а не по фактической структуре.

Избегайте определения структуры для указателя;

typedef struct
{
    list_element header;
    int value;

} apple;
apple *a = malloc(sizeof(apple ));

или Наилучшим подходом будет обращение к type, который pointer содержит, как показано ниже.

typedef struct
{
    list_element header;
    int value;

} *apple;
apple a = malloc(sizeof(*a));
...