我有一个将数据放入结构的函数。我的结构看起来像这样:
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[]
在我的主要部分,然后将它设置为我返回的内容?
有什么想法吗?
答案 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 vertex
,vertex_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.