#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int value;
struct node* next;
} node;
void print(node* list);
int main()
{
node* n1;
node* n2;
n1 = (node *) malloc(sizeof(node));
n2 = (node *) malloc(sizeof(node));
n1->value = 4;
n1->next = n2;
n2->value = 5;
n2->next = NULL;
print(n1);
return 0;
}
void print(node* list)
{
node* p;
p = list;
while (p != NULL)
{
printf("%d ", p->value);
p = p->next;
}
}
代码有效但我的编译器(gcc)发出警告,n1-&gt; next = n2是(从不兼容的指针类型分配) 这是什么意思?我该如何避免呢?
答案 0 :(得分:1)
config_ipython
声明typedef struct {...} node
是node
的类型别名,没有标记。在C中,具有不同标签的两个相同的struct
不是相同的结构。 (此外,没有标签的struct
s的两个声明是不同的struct
s。)声明根本不声明struct
。因此,struct node
指的是不同的,不完整的struct node* next;
。 (它不完整,因为你只用它作为指针。)
这是一种更好的方法。 (将struct
更改为node
只是我的风格;当类型名称很容易与变量名称区分时,我发现它更容易。)请注意typedef的预先声明,它允许在后面的struct定义中使用它。 (当它在定义中使用时仍然不完整,但是因为它是一个指针,所以没关系。)
我还更改了Node
调用以使用所定义变量的类型而不是typename,这通常是更好的样式。 (我删除了不必要的演员表;如果你打算使用C ++,你应该将malloc
更改为malloc
,而不是添加C风格的演员表。)
new
(住在coliru)