初始化全局结构体数组的数组

3
我这样声明一个结构体数组: ```c++ ```
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} };

这很好运行。

现在我需要将tab1tab2合并成一个数组global_tab,但是我到目前为止还无法这样做。我尝试了动态分配,就像这样:

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; - barak manos
1
如果我没记错的话,C初始化列表仅适用于静态和自动存储期? - Martin James
2个回答

3

C语言没有提供数组聚合赋值。花括号结构只能在初始化表达式中使用*。如果你想要将特定的数据放入动态分配的块中,你可以创建一个带有数据的静态变量,并使用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没有动态分配,它可以被初始化。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接