【问题标题】:C freeing a string inside a UnionC 释放联合内的字符串
【发布时间】:2020-07-20 04:19:17
【问题描述】:

所以说我有一个联盟


typedef union Union{
int firstField;
char * secondField;
}Union;

我在堆上分配这个联合并在堆上分配 secondField。如何释放 secondField?

【问题讨论】:

  • 当你尝试free它时出现了什么错误?
  • 我有时会收到退出代码 3,有时程序会挂起并崩溃。我怀疑我遇到了访问冲突错误。另一个帖子上有人说这可能是未定义的行为,因为工会不知道我实际上试图释放 char 指针?
  • 作为联合成员的指针本身并没有什么特别之处。如果它是当前存储在联合中的成员并且它的值是一个有效的指针,那么你可以通过将指针传递给free() 来释放它指向的内存。如果这似乎对您不起作用,那么我们可能需要查看 minimal reproducible example 以了解问题的性质。
  • 联合的问题在于,在创建之后你无法判断你是在处理使用firstField还是secondField的联合。在我的日常工作中,我通过为每个可能的工会成员声明一个带有条目的枚举来处理这个问题。然后我将枚举和联合组合在一个结构中。我与联合成员一起初始化枚举。因此,当我释放时,我可以检查联合是否实际上包含一个指针或只是一个不需要释放的 int。通常,我还编写成员访问函数,并使用断言告诉我何时尝试访问错误的成员。

标签: c memory malloc union free


【解决方案1】:

以显而易见的方式:

Union *up;
up = malloc(sizeof(Union));
up->secondField  = malloc(n);
// ...
free(up->secondField);
free(up);

当然,你不能在赋值和up->secondFieldfree之间赋值给up->firstField。因此,您必须设计代码以确保不会发生这种情况。

【讨论】:

    猜你喜欢
    • 2015-07-07
    • 2019-09-16
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多