数组不存储结构地址

时间:2018-09-27 11:41:47

标签: c arrays pointers data-structures structure

根据我到目前为止所学到的知识,如果我创建了指向大小为array的变量struct adjlistnode的变量v*sizeof(struct adjlistnode)指针,我正在尝试使用邻接表实现图数组每个索引

中的v struct adjlistnode型节点的地址

意味着数组的每个索引都将指向类型为struct adjlistnode的节点,但是当我分配G->array[i]=NULL时会出现错误

||=== Build: Debug in teeest (compiler: GNU GCC Compiler) ===| C:\Users\Mahi\Desktop\DATA STR\teeest\main.c||In function 'creategraph':| C:\Users\Mahi\Desktop\DATA STR\teeest\main.c|59|error: incompatible types when assigning to type 'struct adjlistnode' from type 'void *'| ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

  

为什么我无法将NULL分配给数组的索引

如果我要访问邻接列表,例如使用G->array[i] =与图的第i个顶点相邻的第一个节点地址,以后该怎么办,以后我将根据需要添加另一个节点

struct adjlistnode{
    int dest;
    struct adjlistnode* next;
};
struct graph{
   int V;
   struct adjlistnode* array;
};
struct adjlistnode* getnewnode(int dest){
   struct adjlistnode* newnode =(struct adjlistnode*)malloc(sizeof(struct adjlistnode));
   newnode->dest=dest;
   newnode->next=NULL;
   return newnode;
}
struct graph* creategraph(int v){
   struct graph* G=(struct graph*)malloc(sizeof(struct graph));
   G->V=v;
   G->array=(struct adjlistnode*)malloc(v*sizeof(struct adjlistnode));

   for(int i=0;i<v;i++){
      G->array[i] =NULL;
   }
   return G;

}

3 个答案:

答案 0 :(得分:2)

G->array的类型为struct adjlistnode *

但是

G->array[i]的类型为struct adjlistnode

因此,您无法将NULL(类型void *)分配给类型G->array[i]的{​​{1}}

您可能应该将struct adjlistnode中的array定义为指针的指针

struct graph

然后以下内容将为您工作

struct graph{
   int V;
   struct adjlistnode** array;
};

** Note1 (也由@alk在注释中提到),至少在C89标准中,struct graph* creategraph(int v){ struct graph* G=malloc(sizeof(struct graph)); G->V=v; G->array=malloc(v*sizeof(struct adjlistnode*)); for(int i=0;i<v;i++){ G->array[i] =NULL; } return G; } 返回C malloc。可以将void *分配给任何其他指针类型(反之亦然),因此不需要强制转换void *的返回值。

** Note2 (也由@alk指出)malloc签名是使用类型malloc而不是size_t的参数定义的,因此最好进行修改编写一些代码并使用正确的类型(有关更多信息,请阅读comparing int with size_tsize_t vs int in C++ and/or C

答案 1 :(得分:1)

array是指向struct adjlistnode的(单个)指针。因此可以将其设置为NULL。

 G->array = NULL; //is okay

但这不是指针数组,因此您无法访问该数组的元素,也不能将它们设置为NULL。

对于动态分配,您应该这样做:

struct graph{
   int V;
   struct adjlistnode** array;
};
struct graph* creategraph(int v){
   struct graph* G = malloc(sizeof(struct graph));
   G->V = v;   
   G->array = malloc(v * sizeof(struct adjlistnode*)); //allocation for an array of v pointers 

   for(int i = 0; i < v; i++){    
      G->array[i] = NULL;
   }
   return G;
}

如@alk所建议,最好将v传递为size_t而不是int,因为malloc需要size_t

答案 2 :(得分:1)

G->array[i]返回*(array + i * sizeof(struct adjlistnode)),就像arraystruct adjlistnode array[]

您要做的是存储struct的v对象,但是您尝试使用NULL初始化它们,就像使用指针一样。

您可能想要的是

struct graph{
   int V;
   struct adjlistnode** array;
};

[...]

G->array=(struct adjlistnode**)malloc(v*sizeof(struct adjlistnode*));

这将使array指向指针数组。

然后G->array[i]将返回一个指向结构对象的struct adjlistnode*指针,然后可以用getnewnode()进行初始化。