将结构传递给这样的函数

时间:2016-06-28 02:33:18

标签: c function struct

我有一个关于将结构传递给函数而不首先声明结构的问题。

我有一个带有这样结构指针的函数:

static void DrawArc(struct MATH_POINT *p, other args);

我知道我可以通过这样的结构

struct MATH_POINT point = {0,0};
DrawArc(&point, other args);

但我也可以这样做:

DrawArc(&(struct MATH_POINT){0,0}, other args);

我这样做是因为我在嵌入式平台上,寄存器空间非常有限,我的GUI函数需要很多参数。

但我担心的是,我在参数列表中初始化的结构会一直存在并耗尽RAM。这可能吗?或者,一旦函数完成,结构会被销毁吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

你正在混合和匹配的东西。任何未使用malloc / calloc / etc显式实例化但在本地实例化的对象都不会占用任何堆内存,它只会使堆栈增长直到变量退出范围。

你的第一个例子:

struct MATH_POINT point = {0,0};
DrawArc(&point, other args);

非常好。 point将在堆栈上分配,它不会占用比存储自身所需内存更多的内存,并且会在退出声明范围时自动释放。

在任何情况下,在您的示例中,由于没有动态分配,因此不存在遗漏的风险。

答案 1 :(得分:-1)

struct MATH_POINT point = {0,0};
DrawArc(&point, other args);

此点变量的寿命将超过此

DrawArc(&(struct MATH_POINT){0,0}, other args);

因为第一个的范围在调用DrawArc后仍然存在,而第二个范围在函数返回后被丢弃。 (并且:他们都没有“坚持”,两者都有明确的生命周期;-))

如果你想“删除”一个变量,添加一个额外的范围,如果你不再需要它就关闭它:

#define MANY 10000
{ 
    struct MATH_POINT removeMe[MANY];
    /* work on removeMe while they're alive */
    doThings(removeMe, other_stuff);
} 
/* here removeMe is gone, and the mem can/will be used otherwise */