c - 结构数组的运行时和编译时初始化之间的区别

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

最佳答案

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

例如

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/

相关文章:

c - 在输出中看不到execl之前打印

c - 从地址获取套接字描述符?

C - 了解结构的值设置模式

python - python项目结构是什么

swift - 使用结构进行转换时的对称性。什么是最佳实践?

javascript - jQuery - 代码结构 - 函数内的函数

c - 中止陷阱 : 6 with loop in c

c - 在同一变量的初始化中使用变量

c++ - 类 "list"包含包含类的结构

c - 如何在 Windows C 代码中检测 gdb?