C语言struct变量用{1,2}直接赋值失败但成员单独赋值正常是什么原因
问题根因
- C语言中,用大括号包裹的
{1, 2}属于聚合初始化语法,仅允许在变量声明阶段的初始化操作中使用,不能用于变量声明完成后的赋值操作。 - 你的全局变量
eh在进入main函数前已经完成了默认初始化(全局结构体默认全零初始化),在main中执行eh = {1, 2}属于赋值操作,不符合C语言语法规范,编译器会直接抛出语法错误,程序自然无法正常运行。
合法写法参考
错误复现代码:
struct point { int x; int y; }; struct point eh; // 全局变量已默认初始化 int main() { eh = {1, 2}; // 赋值场景误用初始化语法,非法 printf("%d", eh.x); return 0; }合法写法1 单成员单独赋值(你第二段可运行的写法):
struct point { int x; int y; }; struct point eh; int main() { eh.x = 1; eh.y = 2; printf("%d", eh.x); return 0; }合法写法2 C99及以上标准支持的复合字面量批量赋值:
struct point { int x; int y; }; struct point eh; int main() { eh = (struct point){1, 2}; // 复合字面量语法,赋值场景合法 printf("%d", eh.x); return 0; }
内容的提问来源于stack exchange,提问作者Ricardi
相关产品推荐
相关产品推荐

