C 结构中的数组类型“溢出”到后续字段中?

问题描述 投票:0回答:1

我有以下类型:

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
};

编译器认为

color
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 *'

如何在该结构文字中正确提供

float[4]
值,而不破坏后续字段?

c c99 compound-literals
1个回答
0
投票

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

初始化数组的语法是在大括号中列出其元素的初始值。所以只需将

.color = (vec4) { 0, 0, 1, 1 },
更改为
.color = { 0, 0, 1, 1 },

© www.soinside.com 2019 - 2024. All rights reserved.