我在C有一个新手问题.
我有一个struct Edge定义如下:
我有一个struct 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)时,Edge数组中没有合理的数据(超出范围?).
我想我在这里混淆了一些东西,但我更愿意,如果我可以在不借助矢量数据结构的情况下完成这项工作.这是处理这个的常规方法还是应该自己声明边数组并将其传递给辅助方法来填充它?
编辑:
首先,我要感谢大家的意见/提示/提示/建议/ …他们帮助我找到了我很容易忽视的问题.
在我看到代码应该有效的回复之后,我测试了简化代码(我应该在第一位做的事情),令人惊讶的是,它有效!那么我检查了为什么我的真实代码不起作用,简化版本没有.
我的真实代码看起来像这样:
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 addressess edge.position(我不太明白的东西,它应该只是告诉我0x000000,也许我只是想象事情).
总而言之,这是一个重要的教训,为什么在凌晨3点之后永远不会编码,没有什么好处的!
解决方法
这是一个修改后的版本,它在函数中创建边,并返回包含所有创建边的向量.
#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 },10 }; edges[i] = edge; } return edges; } int main() { auto e( createEdges(5)); std::cout<<e[0].average<<std::endl; }
几乎没有修改:
>而不是分配一个边数组,并返回指针,我返回向量>边缘对象的创建方式和初始化方式(我认为这就是问题)