4

我有一个问题,如何制作一个vertextDegree [nbColours] 包含 nbColours 元素的数组,但是“nbColours”未知,我必须从文件中获取它。看看代码,我能做些什么来解决这个问题?

int nbEdges,nbVetices, nbColours ;
typedef struct st_graphVertex 
{
    int index;
    int colour;
    int val ;
    int vertexDegree[nbColours]; // it won't work because nbColours unknown     
                                 //  here and I want get it from file in the main                    
    struct st_graphVertex *next;        
    t_edgeList *out;
}t_grapheVertex;
4

3 回答 3

2

您不能在 C99 之前的成员或非最后成员中这样做。相反,您可以使该成员成为固定大小的指针:

int* vertexDegree;

并使其指向运行时已知的适当大小的数组:

myVertex.vertexDegree = malloc(nbColours*sizeof(int));
于 2013-09-07T10:01:43.750 回答
2

在 C99 中有一种特殊的语法,尽管它仅限于每个数组struct(在您的情况下可以) - 将数组作为最后一个成员,并减小其大小,如下所示:

typedef struct st_graphVertex 
{
    int index;
    int colour;
    int val ;
    struct st_graphVertex *next;        
    t_edgeList *out;
    int vertexDegree[];   
}t_grapheVertex;

现在你的数组的大小是灵活的:你可以在运行时决定它应该是什么。此外,不同的st_graphVertex值可以以不同的方式设置此大小(尽管在这种情况下,通常将nbColours特定大小作为字段放入相同的struct)。

使用此技巧的“代价”是无法struct在堆栈或全局或静态内存中分配此类 s。您必须动态分配它们,如下所示:

t_grapheVertex *vertex = malloc(sizeof(t_grapheVertex)+sizeof(int)*nbColours);
于 2013-09-07T10:05:59.583 回答
0

您也可以使用Struct Hack来做到这一点,但这与dasblinkenlight在他的回答中所说的相似。

于 2013-09-07T10:27:01.703 回答