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

C何时发布静态分配的变量声明,c,C,我正在编写一个堆敏感的应用程序,因为它运行在一个小型MCU上。我有一个函数,它声明一个输出类型struct来存储数据,然后将数据写入字符串,因此不再需要。如下所示,它是静态定义的,而不是malloc'd C是否会在退出函数后释放堆分配,或者我应该malloc变量并在不再需要时释放它 #define INFO_SIZE 99 char *info = NULL; void function() { struct type_a outvar = HELPER_MACRO(info,

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

C是否会在退出函数后释放堆分配,或者我应该malloc变量并在不再需要时释放它

#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??
}

示例中的变量不是静态的,它是一个变量,表示是的,它将在其封闭范围结束时被销毁-在示例中的函数调用结束时。

示例中的变量不是静态的,它是一个变量,表示是,它将在其封闭范围的末尾销毁—在您的示例中,在函数调用的末尾

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

变量outvar在调用函数时分配。大多数[所有现代]实现使用堆栈,并在函数退出时销毁。每次调用函数时都会初始化变量

void function() { 
  static struct type_a outvar = HELPER_MACRO(info, INFO_SIZE);
变量outvar在全局静态存储中分配给本地作用域,并且在函数退出时不会销毁。在调用main之前初始化变量。初始值设定项必须是常量表达式

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

变量outvar在堆栈上分配,并初始化为堆上已分配块的地址。变量在函数退出时被销毁,但分配的内存不会自动释放。它必须由程序员释放。

自动变量在堆栈中分配。堆栈在进行中的所有函数之间共享。在MCU上,堆栈大小通常非常有限,只有几kB。所以,分配给堆栈上的许多大对象不是一个好主意。@Jezz在uCs上使用动态分配也不好。这也是uC编程如此具有挑战性的原因之一。自动变量在堆栈中分配。堆栈在进行中的所有函数之间共享。在MCU上,堆栈大小通常非常有限,只有几kB。所以,分配给堆栈上的许多大对象不是一个好主意。@Jezz在uCs上使用动态分配也不好。这就是uC编程如此具有挑战性的原因之一。请注意,在发布的代码中没有堆分配。请注意,在发布的代码中没有堆分配。否-在您的静态结构类型为a outvar的示例中,变量分配有静态持续时间,但其作用域是块作为函数体,而不是您所说的全局作用域。@JonathanLeffler是的,我的意思是大多数实现将它们放在全局的.bss或.data段中。当然,范围是函数的局部范围。EditedNo-在您的静态结构类型为a outvar的示例中,变量是以静态持续时间分配的,但其作用域是块作为函数体的,而不是您所说的全局作用域。@JonathanLeffler是的,我的意思是大多数实现将它们放在全局的.bss或.data段中。当然,范围是函数的局部范围。编辑