C何时发布静态分配的变量声明

时间:2019-05-04 04:01:08

标签: c

我正在编写一个对堆敏感的应用程序,因为它在小型MCU上运行。我有一个函数声明一个输出类型的struct来存储数据,然后将其写入字符串,因此不再需要。如下所述,它是静态定义的(不是malloc()的)。

一旦退出function(),C会释放堆分配吗?还是我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 个答案:

答案 0 :(得分:4)

您的示例中的变量不是静态的,它是一个带有automatic storage duration的变量,这意味着,是的,它将在其封闭范围的末尾(在您的示例中的函数调用的末尾)被销毁。 / p>

答案 1 :(得分:1)

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在堆栈上分配,并初始化为堆上已分配块的地址。该变量在函数退出时销毁,但是分配的内存不会自动释放。它必须由程序员释放。