освободить память указателя после вызова функции

#c

#c

Вопрос:

У меня возникли простые сомнения относительно утечки памяти и освобождения памяти в C. Вот мой простой пример

 typedef struct{
     uint16 a;
     uint8 b[3];
     uint8 c;
}log_msg;

typedef struct node{
     log_msg list;
     struct node *next;
}logs_t;
  

Это структура, которая у меня есть. Если я сохраню данные в структуре. Затем, если я хочу получить доступ к структуре с помощью указателя, чтобы проверить список msg_log. Необходимо отменить выделение / освободить указатель. Пример,

 ret = Check_the_list(data);

uint8 Check_the_list(uint16 data)
{
     logs_t *ptr = NULL;
     uint8 brk = 0;
     ptr = top;
     while(ptr != NULL amp;amp; brk == 0)
     {
        if(ptr->list.a == data)
        {
            brk = 1;
            return 0;
        }
        else
        {
            ptr = ptr->next;
        }
     }
     return 1;
  }
  

Здесь необходимо отменить выделение / освободить ptr.Это приведет к утечкам памяти, если эта функция вызывается несколько раз, и я не освобождаю ptr ?. Как я знаю, это автоматически отключит выделение после вызова функции, потому что я не использую динамическую память. Но даже несмотря на то, что я хочу подтвердить с экспертами. Поэтому я прошу экспертов предложить мне.

Комментарии:

1. Какова цель переменной brk, если вы возвращаетесь сразу после ее установки?

Ответ №1:

Да, вам ничего не нужно free() , поскольку вы не выделили никакой памяти для ptr in Check_the_list() .

Самый простой способ запомнить — всякий раз, когда вы выполняете malloc() / calloc() / realloc() , тогда вы выполняете a free() .

В стороне: использование вашего условия цикла brk не требуется, поскольку вы возвращаетесь сразу после поиска данных. Это brk == 0 излишне, и вы могли brk бы полностью устранить:

  while(ptr != NULL)
     {
        if(ptr->list.a == data)
        {
         return 0;
        }
        else
        {
         ptr = ptr->next;
        }
     }
  

Ответ №2:

Ваша переменная ptr — это число, выделенное в стеке, которое содержит адрес. Стек «освобождается», когда ваша функция возвращается. Больше нечего освобождать.

Вы должны выполнить то же число free , что и число malloc . Если вы сделаете нет malloc , вы не должны ничего освобождать. Если вы попытаетесь освободить ptr , это освободит элемент, на ptr который указывает то, что вам не нужно.