初始化结构表用C
问题描述:
我有,我想在我的程序初始化结构表用C
typedef struct MyStructT{
int Output;
int Input1;
int Input2;
};
int n=100;
MyStructT Table[n] = ?? ;
我怎么做的开始初始化结构表?
答
你不能做到这一点使用数组初始化因为n
在编译时已知;即你有一个可变长度数组。
的一种方法是循环在struct
数组的每个元素,并手动初始化成员。它会弹出几行很好。
另外,假设这样的struct
元件的C标准保证连续性,并memset
0是定义明确的初始化一个C struct
的方式,你能memset
整个阵列:
memset (Table, 0, n * sizeof(struct MyStructT));
答
既然你有:
int n = 100;
MyStructT Table[n];
你有一个VLA - 可变长度数组。你不能初始化VLA。期。不知何故,您必须编写代码将它们设置为初始值。
标准(ISO/IEC 9899:2011 - C11)说,在§6.7.9初始化:
¶3类型的实体被初始化应未知大小的阵列或一个完整的 不是可变长度数组类型的对象类型。
请注意,更改n
到const int n = 100;
不使用C帮助(虽然它会在C++ - 但C++不支持VLAS无论如何,尽管GCC让他们)。
如果需求是设置元素的所有字节零,那么你可以写:
memset(Table, '\0', sizeof(Table));
这将做的工作。注意,sizeof(Table)
值是在运行时评估,因为Table
是VLA。
或者,如果您确实不需要VLA,请将数组绑定到enum
或#define
常量,然后您可以使用常规技术初始化阵列。
它是否必须是一个可变长度数组?如果可以使用静态或全局阵列(即它定义为在编译单元的水平,具有固定'#define'长度,而不是'N'),它将被初始化为'0'。否则,在使用之前手动将其设置为“0”。请注意,本地VLA变量通常放在堆栈中,因此在嵌入式环境中,您可能需要小心分配多少。 – Groo