我不断从不兼容的指针类型"得到#34;分配我无法弄清楚原因。我觉得它看起来不错。我只想尝试在C中执行链接列表的基础知识。
typedef struct{
int id;
struct node *next;
} node;
node *root = NULL; // Sets up a root node when the program starts.
create nodes(int id){
if(root == NULL){
root = (node*)malloc(sizeof(node));
root-> id = -1;
node *nextNode;
nextNode = (node*)malloc(sizeof(node));
nextNode -> id = id;
root-> next = nextNode; // This line is throwing an error.
}
}
我觉得这很简单,但我不能把手指放在上面......
答案 0 :(得分:5)
你的struct实际上是一个未命名的struct typedef-d到node
,但是你试图稍后将它称为struct node
(这与你的node
typedef)。快速修复就是简单地为结构命名:
typedef struct node {
int id;
struct node *next;
} node;
或者,如果您愿意(并且这是完全风格的),请删除typedef并更正对结构的其他引用:
struct node {
int id;
struct node *next;
};
struct node *root = NULL;
create nodes(int id){
if(root == NULL){
root = malloc(sizeof(struct node));
root->id = -1;
struct node *nextNode;
nextNode = malloc(sizeof(struct node));
nextNode->id = id;
root->next = nextNode;
}
}
答案 1 :(得分:2)
这里有四点:
首先。如果必须在结构的字段中包含指针,则添加struct node
的名称(如上面指出的@JamesMcLaughlin)。例如:
typedef struct nodetag { int id; struct nodetag * next; } node;
二。确保您按预期使用变量类型create
。我假设您的create
或其他地方存在用户定义的变量类型#define
。如果不是,这将导致编译器错误。即使你这样做了,也不会编译,因为你没有return
return
的{{1}}语句。
第三。在您的函数create
中加入node *root = NULL;
。否则,函数nodes
将无法识别变量nodes
并导致编译器错误。
四。在函数的开头声明局部变量。行root
将导致compiler error for C89,因为C89不允许在语句后使用类型声明。但是,C99允许这种做法。建议在函数开头声明所有局部变量,使其与C89和C99兼容。
答案 2 :(得分:-1)
试试这个
struct node{
int id;
struct node *next;
} ;
struct node *root = NULL; // Sets up a root node when the program starts.
/* Return type is missing in your code*/ create_nodes(int id){
if(root == NULL){
root = (struct node*)malloc(sizeof(struct node));
root-> id = -1;
struct node *nextNode;
nextNode = (struct node*)malloc(sizeof(struct node));
nextNode -> id = id;
root-> next = nextNode; // This line is throwing an error.
}
}