我正在编写一个对堆敏感的应用程序,因为它在小型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??
}
答案 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
在堆栈上分配,并初始化为堆上已分配块的地址。该变量在函数退出时销毁,但是分配的内存不会自动释放。它必须由程序员释放。