You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将结构体作为函数参数直接初始化?C语言struct使用疑问

问题解决:直接传递结构体初始化列表给函数报错

报错原因

printvector2({800, 600});的写法不符合C语法规范——直接的初始化列表不能作为函数实参传递,C语言要求实参必须是合法表达式,裸初始化列表不属于这类表达式。

解决方案:使用复合字面量

C99标准引入了复合字面量语法,可直接在函数调用中构造临时结构体对象,语法格式为(结构体类型){初始化列表}。

修改后的调用代码如下:

printvector2((vector2){800, 600});

完整示例代码

#include <stdio.h>

typedef struct
{
   int x, y;
} vector2;

void printvector2(vector2 v)
{
   printf("x: %d\n", v.x);
   printf("y: %d\n", v.y);
}

int main()
{
    // 直接通过复合字面量传递临时结构体
    printvector2((vector2){800, 600});
    // 也可指定成员名,提升代码可读性
    printvector2((vector2){.x=1920, .y=1080});
    return 0;
}

注意事项

  • 确保编译器支持C99或更高版本(主流编译器如GCC、Clang默认已支持),若使用老版本编译器,需手动开启C99编译模式,例如GCC添加参数-std=c99。
  • 复合字面量创建的临时对象会在当前表达式结束后销毁,但作为函数参数传递时,会先拷贝到函数形参中,不存在生命周期问题。

内容的提问来源于stack exchange,提问作者Artur Moszczyński

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:22:05