我有一个关于将结构传递给函数而不首先声明结构的问题。
我有一个带有这样结构指针的函数:
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。这可能吗?或者,一旦函数完成,结构会被销毁吗?
谢谢!
答案 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 */