在C ++中初始化一个指向结构的指针数组

时间:2018-03-01 14:47:20

标签: c++ arrays pointers struct designated-initializer

可以使用复合文字来初始化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 };

2 个答案:

答案 0 :(得分:3)

首先 - 在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 ++版本将是:

#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::arrayHere'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
}   

答案 1 :(得分:1)

初始化失败的原因是您尝试将指向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