我有结构。
struct ABC {
int a;
int b;
}
并将其作为数组
struct ABC xyz[100];
我想要初始化数组中所有元素为a = 10和b = 20。与此相关的IT技术如何更好地实现呢?
哪种方法更好?
struct ABC {
int a;
int b;
}
并将其作为数组
struct ABC xyz[100];
我想要初始化数组中所有元素为a = 10和b = 20。与此相关的IT技术如何更好地实现呢?
哪种方法更好?
虽然在C语言中没有特别优雅的方法来初始化这样一个大数组,但是是可行的。正如某些答案错误地声称的那样,您不必在运行时进行初始化。而且,如果数组是const
,您也不想在运行时进行初始化。
我使用的方法是定义一些宏:
struct ABC {
int a;
int b;
};
#define ABC_INIT_100 ABC_INIT_50 ABC_INIT_50
#define ABC_INIT_50 ABC_INIT_10 ABC_INIT_10 ABC_INIT_10 ABC_INIT_10 ABC_INIT_10
#define ABC_INIT_10 ABC_INIT_2 ABC_INIT_2 ABC_INIT_2 ABC_INIT_2 ABC_INIT_2
#define ABC_INIT_2 ABC_INIT_1 ABC_INIT_1
#define ABC_INIT_1 {10, 20},
int main()
{
struct ABC xyz[100] =
{
ABC_INIT_100
};
}
注意,这样的宏可以以任何方式组合在一起,以进行任意数量的初始化。例如:#define ABC_INIT_152 ABC_INIT_100 ABC_INIT_50 ABC_INIT_2
使用GCC,您可以使用其扩展语法并执行以下操作:
struct ABC xyz[100] = { [0 ... 99].a = 10, [0 ... 99].b = 20 };
对于一种便携式解决方案,我可能会初始化一个实例,并使用循环将该实例复制到其余部分:
struct ABC xyz[100] = { [0].a = 10, [0].b = 20 };
for(size_t i = 1; i < sizeof xyz / sizeof *xyz; ++i)
xyz[i] = xyz[0];
对我来说,这比在循环中使用实际值更为清晰。它可以被认为是以稍微更高的层次表达所需的结果。
上述语法([0].a
和[0].b
)不是扩展,它是典型的C99。
const
的,你会如何处理呢? - Lundinconst
完成,除非有一个巨大的显式初始化或宏(就像你的答案)。 - unwindfor(unsigned int i=0; i<100; i++)
{
xyz[i].a = 10;
xyz[i].b = 20;
}
我不是C语言专家(所以如果你要来抓我的话...)
这个代码符合规范并且运行良好!
typedef struct
{
double var1;
double var2;
double var3;
double var4;
}VectorData;
#define MAX_INDEX 100
VectorData Data[] = {[0 ... MAX_INDEX] = {0.0, 0.0, 0.0, 0.0}};
这样可以从MAX_INDEX中推断出数组的大小。在这种情况下,您有一个包含101个元素的数组。
在数组子结构中,没有明确的语言支持来初始化所有元素为特定的非零默认值,就像初始化所有元素为零一样;您必须在编译时在源代码中显式地初始化每个元素,或者您必须编写一个for()循环并在启动时初始化每个元素。
正如用户@lundin在另一个答案中指出的那样,您可以使用预处理器宏来减少显式初始化这些值所涉及的输入,但就C编译器而言,您仍然在显式地初始化每个元素。
struct ABC xyz[100] = {[0 ... 99] = {10, 20}};
的意思是定义一个名为xyz的结构体数组,其中包含100个元素,每个元素都是结构体ABC类型。大括号中的[0 ... 99]
用于初始化索引从0到99的所有元素,它们都被赋值为具有成员变量值10和20的结构体ABC。 - BLUEPIXY