【问题标题】:Initialise global array of arrays of structs初始化结构数组的全局数组
【发布时间】:2015-07-25 11:17:49
【问题描述】:

我以这种方式声明一个结构数组:

struct struct_name tab1[6] ={ {"1487" ,0.144}, {"148",2.1},    {"45",0.01}, {"12475847",0.52}, {"46",1.4}, {"0",5} };
struct struct_name tab2[7] = { {"1" ,0.9}, {"76",5.1},{"46",0.17},{"4625",0.0},{"46252",1.57},{"12",1.5},{"5",1.2} };

这很好用。

现在我需要在一个数组global_tab 中创建tab1tab2,并且仍然以这种方式初始化数据,但到目前为止我还不能这样做。我试过这样的动态分配

global_tab = malloc(2 * sizeof(struct struct_name *));
global_tab[0] = malloc(100 * sizeof(struct struct_name));
global_tab[0] = { {"1487" ,0.144}, {"148",2.1}, {"45",0.01}, {"12475847",0.52}, {"46",1.4}, {"0",5} };

但是我得到了这个错误

error: expected expression before ‘{’ token
  global_tab[0] ={ {"1487" ,0.144}, {"148",2.1}, {"45",0.01}, {"12475847",0.52}, {"46",1.4}, {"0",5} };

我希望能够像使用 tab1 一样初始化 global_tab[0]

【问题讨论】:

  • 旁注:global_tab[0] = something 然后global_tab[0] = something else 意味着第一个分配几乎没有用。这就像在做int i = 5; i = 6;
  • IIRC、C 初始化器列表仅适用于静态和自动存储持续时间?

标签: c arrays struct


【解决方案1】:

C 不提供数组聚合赋值。花括号结构仅在初始化表达式* 中可用。如果您想将特定数据放入动态分配的块中,您可以使用数据创建一个static 变量,并使用memcpy,如下所示:

static struct struct_name tmp0[] ={ {"1487" ,0.144}, {"148",2.1},    {"45",0.01}, {"12475847",0.52}, {"46",1.4}, {"0",5} };
global_tab[0] = malloc(sizeof(tmp0));
memcpy(tmp0, global_tab[0], sizeof(tmp0));

* 一些编译器提供结构和数组聚合作为扩展,但使用此功能会使您的代码不可移植。

【讨论】:

    【解决方案2】:

    您对初始化赋值感到困惑。这些操作是不同的,尽管它们都使用=

    int m = 42;  // initialization
    int n;
    n = 42;  // assignment
    

    错误代码类似:

    global_tab[0] = { {"1487" ,0.144}, {"148",2.1}, {"45",0.01}, {"12475847",0.52}, {"46",1.4}, {"0",5} };
    

    这是赋值,不能使用初始化语法。 C99 复合字面量或许正是您想要的。

    【讨论】:

    • 如果global_tab不是动态分配的,它可以被初始化。
    猜你喜欢
    • 2010-11-22
    • 1970-01-01
    • 2022-01-13
    • 2015-07-29
    • 1970-01-01
    • 2012-05-02
    • 2015-07-30
    • 2017-01-05
    • 2011-05-09
    相关资源
    最近更新 更多