2

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

2 回答 2

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++'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这是对好处的一种解释。实际上,您可以做得更好,并减少重复自己的次数:

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取自这里;你也有,但这还没有标准化。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
}   
于 2018-03-01T15:03:24.123 回答
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
于 2018-03-01T15:15:57.690 回答