为什么这个结构赋值数组不能编译?

com*_*der 5 c arrays struct

here is the code 

struct point_tag {
        int x;
        int y;
};

typedef struct point_tag Point;

int main(void) 
{
      Point pt[] = { {10,20}, {30, 40}, {50,60}};
      pt[0] = {100,200};
}
Run Code Online (Sandbox Code Playgroud)

当我这样做时pt[0] = {100, 200},编译器一直在抱怨

错误:'{'标记之前的预期表达式

我不是真的那么做.不是{token assignment operator(=)之前的表达式吗?

我不明白为什么这项任务会成为一个问题.地址pt处的值指的是Point数组.我只是将第0个点设置为这个新点,我知道以类似的格式分配结构{100,200}是合法的,其中该数组中的元素只是字段.

Gya*_*ain 6

对于赋值,请对类型进行类型转换以键入Point以使其成为复合文字:

pt[0] = (Point){100,200};
Run Code Online (Sandbox Code Playgroud)

使用gcc 实时代码

这相当于

{
  Point temp = {100,200};
  pt[0] = temp;
}
Run Code Online (Sandbox Code Playgroud)

ps复合文字在旧的严格C89兼容编译器中不可用.它可以在GCC中用于C89作为扩展,而在C99复合文字是核心功能.

  • 因为上面的结构只能用于初始化.在`pt [0] =(Point){100,200};`中,您正在创建一个临时`Point`并将其赋值给`pt [0]`.你必须告诉编译器``{100,200}`是`Point`还是`int [2]`或其他东西. (2认同)
  • 如果我之前的评论未能回答您的问题,我建议您阅读C99规范部分6.5.2.5复合文字. (2认同)