C:结构中的结构

时间:2012-06-26 23:11:26

标签: c pointers struct

我的任务是创建一个包含节点和边缘的简单图形。 在我给出的头文件中,我无法修改

typedef struct Edge_s* Edge;
typedef struct Node_s* Node;
typedef struct Graph_s* Graph;

和我的graph.c

typedef struct{
  size_t w;
  struct Node_s* target;
}*Edge;

typedef struct{
  size_t value;
  Edge* edges;
  size_t s;
}*Node;

typedef struct{
  Node* nodes;
  size_t n;
  Edge* edges;
  size_t e;
}*Graph;

Edge create_edge(Node t, size_t w){
  Edge ret = malloc(sizeof(*ret));
  ret->target = t;
  ret->w = w;
  return ret;
}

这会在编译时发出警告

warning: assignment from incompatible pointer type

我在这里感到困惑,我出错了什么,我该如何解决?该程序几乎正在工作,我得到一个奇怪的错误,我认为可能是因为这个。

2 个答案:

答案 0 :(得分:6)

你的typedef定义很糟糕。我很惊讶它甚至编译。

您首先将typedef-name Edge定义为

typedef struct Edge_s* Edge;

然后将其重新定义为

typedef struct{
  size_t w;
  struct Node_s* target;
}*Edge;

这两个定义以两种完全不相关的方式定义Edge。 (如果第一组声明符合同一翻译单元中的第二组,我知道的所有C编译器都会立即报告错误。)

我会说你的第二个结构定义应该只是

struct Edge_s {
  size_t w;
  struct Node_s* target;
};

不要尝试重新定义现有的typedef-name。这在C中完全是非法的。

答案 1 :(得分:2)

问问自己ret-gt;目标指向的对象是什么类型,对象是什么类型的对象?它们是相同类型的物体吗?