【发布时间】:2015-01-07 07:17:19
【问题描述】:
我有一个看起来像这样的结构。
struct MyStruct1 {
int (*fn)();
int b;
}
还有一个类似这样的结构。
struct MyStruct2 {
int a;
struct MyStruct1 b[0];
}
我想声明一个 MyStruct2 类型的全局变量,有点像这样。
int func1() { return 1; }
int func2() { return 2; }
struct MyStruct2 a = { 1, { func1, 5 }, { func2, 6 } };
但是,我得到一个“Initializer Element is not a compile-time constant”。
我想知道 (a) 是否甚至可以全局声明一个可变大小的结构体(或者至少定义一块正确大小的空间,以便稍后插入值),以及 (b ) 如果是,我做错了什么?
【问题讨论】:
-
编译器会在编译代码时为你的结构分配空间。由于您无法告诉它您的结构有多大,因为这只会在执行时发生,所以您想要的实际上是不可能的。编译器无法进行时间旅行。您必须简单地为您的结构放入一个指针,然后稍后再分配适当的空间。
-
也许flexible arrays 是一个选择。
-
@MarcB - 所以没有办法告诉编译器
a应该有 xMyStruct1s 的空间。或者甚至分配适当大小的空间,以便稍后插入值? -
你可以给它你想要的最大可能大小,但如果你很少使用那么多,那么你将浪费大量的 ram 为几乎从未发生过的事情保留空间。这就是为什么有 malloc() - 根据需要在运行时动态分配内存。