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

为何C99不允许此类结构体初始化方式?请解释原因

C99结构体赋值语法疑问解答

不被C99允许的写法

struct Point {int x; int y;};
struct Data {struct Point p;};
struct Data data = {0};
data.p = {.x = 2, .y = 4};

被C99允许的写法

struct Point {int x; int y;};
struct Data {struct Point p;};
struct Data data = {0};
struct Point p = {.x = 2, .y = 4};
data.p = p;

原因解释

  • {.x = 2, .y = 4}是C99引入的指定初始化器,它属于变量初始化语法,只能用在声明变量的同时完成赋值的场景,不能作为普通赋值语句的右值使用。第一个例子里的data.p = {.x = 2, .y = 4};是对已经初始化好的结构体成员做赋值操作,这时候指定初始化器不是合法的表达式,因此C99不允许这种写法。
  • 第二个例子里,struct Point p = {.x = 2, .y = 4};是合法的变量初始化,先创建并初始化了一个同类型的结构体变量p,之后data.p = p;是结构体变量之间的直接赋值,C99允许同类型结构体变量直接赋值,本质是把p的每个成员值逐拷贝给data.p,所以这种写法是合规的。

内容的提问来源于stack exchange,提问作者kevinarpe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:35:22