C 将结构传递给这样的函数

C 将结构传递给这样的函数,c,function,struct,C,Function,Struct,我有一个关于在不首先声明结构的情况下将结构传递给函数的问题 我有一个函数,它采用如下结构指针: static void DrawArc(struct MATH_POINT *p, other args); DrawArc(&(struct MATH_POINT){0,0}, other args); 我知道我可以通过这样的结构 struct MATH_POINT point = {0,0}; DrawArc(&point, other args); 但我也可以这样做: st

我有一个关于在不首先声明结构的情况下将结构传递给函数的问题

我有一个函数,它采用如下结构指针:

static void DrawArc(struct MATH_POINT *p, other args);
DrawArc(&(struct MATH_POINT){0,0}, other args);
我知道我可以通过这样的结构

struct MATH_POINT point = {0,0};
DrawArc(&point, other args);
但我也可以这样做:

static void DrawArc(struct MATH_POINT *p, other args);
DrawArc(&(struct MATH_POINT){0,0}, other args);
我这样做是因为我在一个寄存器空间非常有限的嵌入式平台上,我的GUI函数需要很多参数

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


谢谢

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

您的第一个示例:

struct MATH_POINT point = {0,0};
DrawArc(&point, other args);
很好<代码>点将在堆栈上分配,其占用的内存不会超过存储自身所需的内存,并将在退出声明范围时自动释放


无论如何,在您的两个示例中,由于没有动态分配,因此不存在将东西留在周围的风险。

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

struct MATH_POINT point = {0,0};
DrawArc(&point, other args);
您的第一个示例:

struct MATH_POINT point = {0,0};
DrawArc(&point, other args);
很好<代码>点将在堆栈上分配,其占用的内存不会超过存储自身所需的内存,并将在退出声明范围时自动释放

在任何情况下,在两个示例中,由于没有动态分配,因此不存在将东西留在周围的风险

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 */
此点变量的寿命将比此点变量的寿命长

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 */

如果不知道您使用的特定编译器和处理器,则无法回答此问题。另外,您是否将在启用优化的情况下进行构建。我使用的是arm none eabi和-O2,我使用的是STM32F767-144引脚。如果不知道您使用的特定编译器和处理器,则无法回答此问题。此外,无论你是否将建立与优化启用。我使用arm无eabi和我有-O2我使用STM32F767-144引脚。谢谢你的答案!我想我也会测试这两种方法的代码大小。我想我会坚持使用第一种方法,保留点变量以备将来使用。谢谢你的回答!我想我也会测试这两种方法的代码大小。我想我会坚持使用第一种方法,并保留point变量以备将来使用。
,而第二种方法在函数返回时会被丢弃否。函数不引入或结束作用域。复合文字的生存期一直持续到当前块(函数调用所在的块)中的结束括号。。。函数参数(如果它们是这个调用的临时参数)什么时候会超出范围?一旦函数返回。我没说引入了新范围?!?我反对你的引用,这是不正确的。它是在堆栈上创建的,通过调用函数的ret释放的。怎么了??请回答。“见第一条评论”并不是说这句话不正确。请参阅第一条注释。
,而第二条注释将在函数返回后立即丢弃否。函数不引入或结束作用域。复合文字的生存期一直持续到当前块(函数调用所在的块)中的结束括号。。。函数参数(如果它们是这个调用的临时参数)什么时候会超出范围?一旦函数返回。我没说引入了新范围?!?我反对你的引用,这是不正确的。它是在堆栈上创建的,通过调用函数的ret释放的。怎么了??请回答。“见第一条评论”并不是说这句话不正确。见第一条评论。