在C 中初始化结构数组

Initialize array of structs in C++

本文关键字:结构 数组 初始化      更新时间:2023-10-16

我在我的代码中具有结构节点:

struct Node {
Node() : prev(0), left(0), right(0) {}
Node* prev;
Node* left;
Node* right;
char val;
};

i初始化类似节点的结构对象的数组:

Node** pool = new Node*[10000000];

我认为它将使用Defoult构造器创建节点结构对象,但实际上数组似乎是空的。是否有任何有效的方法来创建"空"对象的数组?

您应该使用 std::vector<>;在C 中使用new的理由很少。

 auto pool = std::vector<Node>(10000000);

(您的原始代码是创建Node* S,而不是Node s。(


如果由于某种原因您不想使用vector,则可以使用std::unique_ptr<>。该代码将是

std::unique_ptr<Node[]> pool(new Node[10000000]);

但是您确实应该使用vector


另外,您可以简化和改进Node

struct Node final {
Node* prev = nullptr;
Node* left = nullptr;
Node* right = nullptr;
char val = '';
Node(const Node&) = delete;
Node& operator(const Node&) = delete;
};

如果您要构建AST/ASG,并且不需要线性数据结构,则可以考虑仍然考虑使用::std::vector<>分配内容,这可能会给您带来缓存的位置。

您仍然可以通过结构中的指针链接单个Node对象。如果您然后使用索引而不是指针,则每当您的池中可用对象用完时,甚至可以调整矢量大小。

Node** pool = new Node*[10000000];

构造Node*的数组而不是Node。您正在寻找的是

Node* pool = new Node[10000000];

构造Node的数组。如果您实际上想要Node*的数组,则适当的初始化是

int nObjects = 10000000;
Node** pool = new Node[nObjects];
for(auto i = 0; i < nObjects; ++i) {
    pool[i] = new Node();
}

正如其他人所说的那样,您可能不想使用new或C风格数组。