Когда C выпустит статически размещенные объявления переменных - PullRequest
1 голос
/ 04 мая 2019

Я пишу приложение, чувствительное к куче, поскольку оно работает на небольшом MCU.У меня есть функция, которая объявляет структуру выходного типа для хранения данных, которая затем записывает их в строку, и, следовательно, больше не требуется.Как показано ниже, он определен статически (не malloc() 'd).

Освободит ли C выделение кучи после выхода из function() или мне нужно malloc для переменной и free для нее, когда она больше не требуется?

#define INFO_SIZE 99

char *info = NULL; 

void function() { 
    struct type_a outvar = HELPER_MACRO(info, INFO_SIZE);
    convert_to_string(&outvar, "helloworld"); 
    // delete outvar??
}

Ответы [ 2 ]

4 голосов
/ 04 мая 2019

Переменная в вашем примере не является статической, это переменная с автоматической продолжительностью хранения , что означает, что да, она будет уничтожена в конце своей охватывающей области - в конце вызова функции вваш пример.

1 голос
/ 04 мая 2019
void function() { 
  struct type_a outvar = HELPER_MACRO(info, INFO_SIZE);

Переменная outvar выделяется при вызове функции (большинство [всех современных] реализаций используют стек) и уничтожается при выходе из функции.Переменная инициализируется каждый раз, когда вызывается функция.

void function() { 
  static struct type_a outvar = HELPER_MACRO(info, INFO_SIZE);

Переменная outvar размещается в глобальном (статическом) хранилище с локальной областью действия и не уничтожается при выходе из функции,Переменная инициализируется до вызова main.Инициализатор должен быть константным выражением.

void function() { 
  struct type_a * outvar = malloc(...);

Переменная outvar размещается в стеке и инициализируется по адресу выделенного блока в куче.Переменная уничтожается при выходе из функции, но выделенная память не освобождается автоматически.Он должен быть освобожден программистом.

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