从函数返回结构

时间:2013-11-21 17:22:26

标签: c data-structures logic

我有一个将数据放入结构的函数。我的结构看起来像这样:

 typedef struct vertex_tag{
    int visited;
    double weight;
    int prev;
 }vertex_t;

我像这样初始化它;

vertex_t * vertex[G->vertices];
    for(i=0; i < G->vertices; i++)
    {
        vertex[i] = (vertex_t*)malloc(sizeof(vertex_t));
        vertex[i]->weight = FLT_MAX;
        vertex[i]->visited = 0;
    }

它通过函数将数据放入数组,权重,访问和prev。

我的问题是,如何在主函数中获取这些值?我会创建另一个

吗?
vertex * vertex[]

在我的主要部分,然后将它设置为我返回的内容?

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

在堆上分配:

您应该使用malloc来创建阵列。否则,您在堆栈上创建数组,但您无法返回它。如果返回阵列的地址,则数据可能已损坏。

替换:

vertex_t * vertex[G->vertices];

vertex_t ** vertex = malloc(sizeof(vertex_t*) * G->vertices);

return vertex类型vertex_t **

vertex_t的数组,而不是指针数组:

此外,这不是问题,但我想知道你为什么使用指针数组。您可以像这样更改代码:

vertex_t * vertex = malloc(sizeof(vertex_t) * G->vertices);
for(i=0; i < G->vertices; i++)
{
    vertex[i].weight = FLT_MAX;
    vertex[i].visited = 0;
}

return vertexvertex_t *类型(vertex_t数组)。如果您需要该数组中元素的地址,您仍然可以&vertex[i]

这两种方法都可以,但是在你的解决方案中,你做了额外的内存分配,它使用更多的内存,它更慢,你需要在某个时候释放内存。从硬件的角度来看,如果经常迭代所有阵列,你还会做更多的缓存未命中导致代码变慢。

唯一的用法是,如果您有另一个函数创建的顶点,并且您不想复制数组中的数据。

我建议你绘制2个解决方案:一个是带有大单元格的数组,另一个是带有指向单个单元格的数组。

答案 1 :(得分:0)

由于vertex是一个数组,因此无法从函数返回数组。 要么你必须......

1. return the pointer to the array from the function 
or
2. Put the `vertex` array in a structure and return the structure.