在C 中创建结构数组

Creating array of structs in C++

本文关键字:结构 数组 创建      更新时间:2023-10-16

我在C 中有一个新手问题。
我的结构Edge定义为以下:

struct Edge {
    int position[4];
    int average;
};

现在,我需要创建很多这样的结构,并为此创建了一个辅助方法,该辅助方法基于某些参数创建了这些结构的数组:

Edge* createEdges(int some_parameters){
    Edge *edges = new Edge[8];
    for(int i = 0 ; i < 8; i++){
        Edge edge;
        edge.position[0] = 1; //fill the rest of the edge array in the same manner
        edge.average = 10;
        edges[i] = edge;
    }
    return edges;
}

但是,当我现在致电时:Edge *edges = createEdges(int some_parameters)边缘数组中没有明智的数据(范围不超出?)。

我认为我在这里混合了一些东西,但是如果我可以在不求助于vector数据架构的情况下进行此工作,我更喜欢。这是处理此操作的正常方式,还是我应该自己声明边缘数组并将其传递给助手方法以填充它?

编辑:

首先,我要感谢所有人的评论/提示/提示/建议/...他们帮助我找到了我很容易忽略的问题。
在看到代码应该起作用的答复后,我测试了简化的代码(我应该在第一名中做的事情),而且令人惊讶的是,它有效!因此,我检查了一下我的真实代码为什么不起作用而简化的版本也是如此。
我的真实代码看起来像这样:

Edge* createEdges(int some_parameters){
     Edge* edges = new Edge[8];
     if(some_parameter != 0){
          //create the edges as in my 1st snippet
          return NULL; //doh, should return edges here !
     } else { 
          return NULL;
     }
}

我没有看到我只是返回错误的值(null)的原因是因为调试器向我展示了一些0xf6f6f6地址,其中有一些edge.position的负值(我不太了解,它应该只是显示我0x000000,也许我只是在想象)。

总的来说,这是一个重要的教训,为什么凌晨3点以后永远不要代码,没有什么好处!

它是C 使用std::vector

std::vector<Edge> createEdges(int some_parameters){
    std::vector<Edge> edges;
    for(int i = 0 ; i < 8; i++){
        Edge edge;
        edge.position[0] = 1;
        edge.average = 10;
        edges.push_back(edge);
    }
    return edges;
}

您在这里拥有的功能正常。我觉得您忘记的是,当您打电话

Edge *edges = createEdges(int some_parameters)

边缘变量是指向列表中第一个元素的指针。如果您要这样做:

edges[0]

或:

edges[1]

您会看到这些值不同,现在您需要循环访问数组。请记住,您不会在循环期间通过阵列的末端。这就是为什么大多数人说使用向量的原因,因为您可以使用迭代器使用更多的安全功能。

欢迎来到C !用于创建类实例的辅助方法(C 中的结构是所有字段均为公共的类)称为构造函数。这是我将使用构造函数创建边缘类的实例。

class Edge {
public:
    int position[4];
    int average;
    Edge();
};
Edge::Edge() //constructor
{
    position[0] = 1;//fill the rest of the edge array in the same manner
    average = 10;
}
int main()
{
    Edge* myEdge = new Edge(); //constructor called
    Edge* myEdges[8];
    for (int i = 0; i < 8; i++)
    {
        myEdges[i] = new Edge();
    }
    return 0;
}

这是一个有点修改的版本,可以在函数中创建边缘,并返回包含所有创建边缘的向量。

#include <iostream>
#include <vector>
struct Edge {
    int position[4];
    int average;
};
std::vector< Edge > createEdges(int some_parameters){
    std::vector< Edge > edges( 8 );
    for(int i = 0 ; i < 8; i++){
        const Edge edge{ { 1, 0, 0, 0 }, 10 };
        edges[i] = edge;
    }
    return edges;
}

int main()
{
    auto e( createEdges(5));
    std::cout<<e[0].average<<std::endl;
}

几乎没有修改:

  1. 我没有分配一个边数和返回指针,而是返回向量
  2. 创建边缘对象的方式和初始化(我认为这是问的)