如何释放C语言结构体?

4

给定一个结构体,例如:

typedef struct
{
  int value;
} TestStruct;

以下代码(在iPhone上运行的Objective-C类的上下文中)为什么会抛出“非对齐指针被释放”异常?
TestStruct ts = {33};
free(&ts);

注意:我的终极目标是使用一个包含许多向量数学函数的C库,因此需要找到一种可行的方法来混合C和Objective-C。


1
Objective-C 简单来说就是 C 语言的一个严格超集,因此你可以完全混合使用它们。 - Jason Coco
2个回答

25

我看你似乎尝试释放一个栈或静态变量。你需要使用malloc()分配内存才能使用free()释放。

尝试使用以下方法:




TestStruct *ts = malloc(sizeof(TestStruct));
ts->value = 33;
free(ts);

对于那些更熟悉面向对象语言的人来说,创建一个构造函数可能会很有帮助:

TestStruct *newTestStruct(int value)
{
    TestStruct *ret = malloc(sizeof(TestStruct));
    ret->value = value;
    return ret;
}

这使您能够一步分配一个结构体并设置其值。只需记住,一旦不再有用,就应该释放此值:

TestStruct *x = newTestStruct(3);
free(x);

非常清晰,谢谢!但是:有没有一种方法可以同时分配和填充? - Ariel Malka
没有直接的方法,但是如果你想要的话,你可以创建自己的构造函数。我编辑了帖子来解释如何做到这一点。 - Kyle Cronin
感谢在编辑后投票支持这个答案的人们。我刚刚加入了10k俱乐部!:-D - Kyle Cronin
我不明白的是,如果我们从问题的读者那里得到了很多投票,这意味着什么?我想说的是10K俱乐部的意思? - Tirth

7

因为您试图释放在栈上分配的内容。函数free()只能用于使用malloc()分配的内存。


没错。但是这个人似乎对堆和栈没有很好的掌握,所以让我们不要用各种静态分配的微妙之处来困惑他 :)。 - JSBձոգչ
没错!(来自Java方面的人 :-)) - Ariel Malka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接