在 C 外部函数中释放结构

Deallocating struct in C outside function

我正在我的代码中创建结构对象,我想销毁这个对象。我知道,为了创建指针,我必须使用 malloc() 来分配和 free() 来释放指针或数组。但我对结构对象有疑问。我在这里寻找答案,我找到了使用方括号 {} 的解决方案 - 将结构对象放在方括号中,因此右方括号之外的结构对象将被释放。但我有兴趣在全局数组中释放对象。我怎样才能解除分配这样的对象?示例代码

typedef struct {
  unsigned char m_some_property;
} my_struct;


static my_struct g_myStructArr[10];


int main(void)
{
  g_myStructArr[0].m_some_property = 20;
  // how to use brackets {} here to deallocate that object?
  return 0;
}

这可能吗?

你不能,全局变量将在程序的生命周期内分配。另外我不明白你为什么要这样做,你不应该担心这一点,因为很少需要使用全局变量。程序启动时分配全局变量,程序结束时释放全局变量。

C 程序的可执行文件分为以下部分:

文本段:

本节读入二进制机器码。文本段通常是只读段以防止被修改。

初始化数据段:

所有初始化的全局变量、静态变量、常量变量和外部变量都记录在这个部分。

未初始化的数据段:

此部分包含所有未初始化的全局和静态数据,并在程序开始执行前初始化为零。

堆:

几乎所有的动态内存分配都来自这个部分。

堆栈:

这个段从一个非常高的地址开始,并随着函数的调用而增长下行字。 函数帧、局部变量、return 地址等从该段获取内存。正如埃利亚斯指出的那样, 这个堆栈与堆栈数据结构非常不同。这是一个内存段,其中是一个样式 组织数据。它们唯一的共同点是它们以后进先出的方式动态增长。

针对您的问题,您需要在全局 space 中声明一个指针,例如

my_struct *foo;

并且在 main() 中,您可以动态分配所需的内存并使此指针指向该内存

foo = calloc(10, sizeof (my_struct));

当您需要释放内存时,您可以使用 realloc() 来调整它的大小。

malloc()、calloc() 不适用于全局数据段。 malloc 库通过在初始化时扩展断点来占用一大块内存,并在该内存区域中托管使用​​ malloc() 等完成的动态内存分配。