在C中初始化一个指向结构的指针数组可以使用复合文字来完成。
typedef struct {
int a;
int b;
} s;
在C:
s *ptrArray[] = {
&(s){
.a = 1,
.b = 2
},
&(s){
.a = 4,
.b = 5
}
};
如何在C ++中完成?
我也看到了在C ++中使用复合语句初始化结构的区别:
s s1 = { a: 7, b: 8 };
首先 - 在C语言中将任何内容初始化为临时值的地址似乎非常可疑。你确定这个有效吗?嗯。无论如何,C ++编译器真的不会让你这样做。
至于你指定的(命名字段)初始化C ++行 - 它实际上是非标准的,它是GNU C ++扩展,你不能依赖它。
你可以这样做:
struct s { int a, b; };
int main() {
s data[] = { { 1, 2 }, { 4, 5 } };
// instead of ptrArray[i], use &(data[i])
}
编译得很好。但是 - 这个代码的更多C ++'ish版本将是:
#include <array>
struct s { int a, b; };
int main() {
std::array<s, 2> data { s{ 1, 2 }, s{ 4, 5 } };
// instead of ptrArray[i], use &(data[i]),
// or use iterators, or ranged for loops
}
你为什么要使用std::array
? Here's one explanation的好处。实际上,你可以做得更好,并重复自己少用:
int main() {
auto data = make_array(s{ 1, 2 }, s{ 4, 5 });
// instead of ptrArray[i], use &(data[i]),
// or use iterators, or ranged for loops
}
make_array
函数取自here;你也有std::experimental::make_array()
,但那还没有标准化。
如果要在运行时添加或删除data
中的元素,可以切换到使用std::vector
:
#include <vector>
struct s { int a, b; };
int main() {
std::vector<s> data { s{ 1, 2 }, s{ 4, 5 } };
// instead of ptrArray[i], use &(data[i]),
// or use iterators, or ranged for loops
}
初始化失败的原因是你试图将struct指针数组初始化为数字文字常量的地址。同样如下:
#define A 5
int b = &A; /* NOT HAPPENING */
(你不能拿5
的地址)
您可以通过简单地初始化s
数组而不是s
的指针数组来解决您的问题,例如:
s ptrarr[] = { {1, 2}, {4, 5} };
通过该更改,您的阵列将初始化正常,例如
#include <iostream>
typedef struct {
int a;
int b;
} s;
int main (void) {
s ptrarr[] = { {1, 2}, {4, 5} };
int cnt = 0;
for (auto& i : ptrarr)
std::cout << "ptrarr[" << cnt++ << "] : " << i.a << ", " << i.b << "\n";
}
示例使用/输出
$ ./bin/ptrarrystruct
ptrarr[0] : 1, 2
ptrarr[1] : 4, 5