结构数组的运行时和编译时初始化之间的差异

时间:2014-08-26 18:22:01

标签: c structure

我在某处阅读"你无法在运行时初始化这样的结构。" 例如:

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

1 个答案:

答案 0 :(得分:4)

这与编译时和运行时之间的差异无关,而是与初始化和赋值之间的差异有关。初始化始终是声明的一部分。

例如

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