我的任务是创建一个包含节点和边的简单图形。 在我给出的无法修改的头文件中,我有
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
我在这里有点困惑,我哪里错了,我应该如何解决?该程序几乎可以正常工作,但我遇到了一个奇怪的错误,我认为可能是因为这个。
最佳答案
你的 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;
};
不要尝试重新定义现有的类型定义名称。这在 C 中是完全非法的。
关于C: 结构中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11217237/