代码之家  ›  专栏  ›  技术社区  ›  Ethan McTague

在C结构中键入Array会“溢出”到后续字段中吗?

  •  0
  • Ethan McTague  · 技术社区  · 2 年前

    我有以下几种类型:

    typedef float vec4[4]; // from cglm
    typedef struct Node Node;
    struct Node {
        float expand;
        vec4 color;
        Node *children;
    }
    

    出于某种原因 color 场的 float[4] 类型…溢出?例如,当使用以下文字时:

    Node test1 = (Node) { 
       .expand = 1.0f,
       .color = (vec4) { 0, 0, 1, 1 },
       .children = NULL
    };
    

    编译器认为 颜色 children 两个字段都应该是单一的 float s

    • error: initializing 'float' with an expression of incompatible type 'vec4' (aka 'float[4]')
    • error: initializing 'float' with an expression of incompatible type 'void *'

    我如何正确地提供 浮动[4] 此结构文字中的值,而不破坏后续字段?

    1 回复  |  直到 2 年前
        1
  •  3
  •   Eric Postpischil    2 年前

    (vec4) { 0, 0, 1, 1 } 是a 复合文字 这确实是一个数组。但是,您不能使用数组初始化数组(字符串文字除外),就像您不能将数组分配给数组一样。数组从来不是C中可以作为单个对象操作的一级对象;它们一直是多种事物的集合。此外,复合文字是后来添加到语言中的。

    初始化数组的语法是用大括号列出其元素的初始值。所以简单地改变 .color = (vec4) { 0, 0, 1, 1 }, .color = { 0, 0, 1, 1 }, .