我在某处读到“你不能在运行时初始化这样的结构。” 示例:
#define NOOFITEM 12
struct item_info
{
char itemname[15];
int quantity;
float retail;
float wholesale;
}item[NOOFITEM];
int main()
{
item[0]={"rice",10,40,30};
item[1]={"sugar",10,40,30};
item[2]={"soap",10,40,30};
}
但是如果你想在运行时赋值,那么你必须像这样手动完成:
int main()
{
strcpy(item[0].itemname, "rice");
item[0].quantity = 10;
item[0].retail = 40;
item[0].wholesale = 30;
}
我在互联网上尝试过,但无法知道其中的区别。我想知道这两者在运行时间和编译时间方面的区别。 请也向我解释下面的一个。这是运行时还是编译时?我们实际上如何决定哪个是运行时,哪个是编译时!
struct item_info
{
char itemname[15];
int quantity;
float retail;
float wholesale;
}item[NOOFITEM] =
{
{"rice",10,40,30},
{"sugar",10,40,30},
{"soap",10,40,30}
};
最佳答案
这与编译时和运行时的区别无关,而是与初始化和赋值的区别有关。初始化始终是声明的一部分。
例如
int a = 5; // declaration with initialization
int b; b = 5; // declaration (without initialization) followed by an assignment
您尝试使用(在您的第一个示例中)分配给结构的语法只能用于初始化,即在声明本身中。在您的最后一个代码片段中,您在声明期间进行了初始化,这很好。
作为一种绕过这种语法限制的方法,您可以使用复合文字(在 C99 中添加),一个带括号的类型名称,后跟由 {
… } 括起来的初始化器列表
:
struct item_info
{
char itemname[15];
int quantity;
float retail;
float wholesale;
} item[NOOFITEM];
int main(void)
{
item[0] = (struct item_info){ "rice", 10, 40, 30 };
item[1] = (struct item_info){ "sugar", 10, 40, 30 };
item[2] = (struct item_info){ "soap", 10, 40, 30 };
}
关于c - 结构数组的运行时和编译时初始化之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25512647/