在 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() 等完成的动态内存分配。
我正在我的代码中创建结构对象,我想销毁这个对象。我知道,为了创建指针,我必须使用 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() 等完成的动态内存分配。