Проблемы с указателем на структуру - PullRequest
0 голосов
/ 01 июля 2019

Память не была освобождена Пожалуйста, помогите с этой проблемой

#include <stdio.h>
#include <stdlib.h>

typedef struct paramint
{
   short  val;
   char   name[150 + 1];
}tParamint;

int main(int argc, char *argv[]) {
    tParamint *e;

    e=(tParamint*)malloc(2*sizeof(tParamint));
    e[1].val=12;
    e[2].val=13;

    printf("e[1].val=[%d]\n", e[1].val);
    printf("e[2].val=[%d]\n", e[2].val);
    free(e);
    printf("e[1].val=[%d]\n", e[1].val);
    printf("e[2].val=[%d]\n", e[2].val);

    return 0;
}   

Начальное значение: е [1] .val = [12] е [2] .val = [13] * * +1004

После бесплатно е [1] .val = [12] е [2] .val = [13]

1 Ответ

2 голосов
/ 01 июля 2019

Из ссылки

Есть две точки

  1. Блок памяти, ранее выделенный при вызове malloc, calloc или realloc,освобождается, делая его снова доступным для дальнейшего распределения.
  2. Обратите внимание, что эта функция не изменяет значение самого ptr, следовательно, она все еще указывает на то же (теперь недействительное) местоположение.

Таким образом, память, которую вы только что освободили, не освобождается сразу, она просто помечается как перераспределяемая, и ваш ptr указывает на недопустимое местоположение.Так что хорошей идеей будет отменить ссылку на ptr на null сразу после освобождения ptr.

Отменив ссылку на ptr на null после того, как вы убедитесь, что выне освобождая одну и ту же память более одного раза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...