我尝试更好地理解结构时遇到了一个奇怪的错误,我想更好地理解它。我试图创建一个小的链表而不使用malloc(),并通过前一节点的.next字段引用它并使用 - >打印其中一个。符号
我有以下代码:
1 #include<stdio.h>
2 #include<stdlib.h>
3
4 int main(){
5
6 typedef struct {
7 int data;
8 struct node *next;
9 }node;
10
11 node m;
12 m.data = 350;
13 m.next = NULL;
14
15 node n;
16 n.data = 2;
17 n.next = &m;
18
19 printf("%d %d \n", m.data, n.next->data);
20 return 0;
21
22 }
我在第17行收到错误说:
“警告:从不兼容的指针类型分配[默认启用] n.next =&amp; m;“
第19行的错误说:
“错误:取消引用指向不完整类型的指针 printf(“%d%d \ n”,m.data,n.next-&gt; data);“
然而,有人稍微更改了代码并使代码工作。这是功能代码:
1 #include<stdio.h>
2 #include<stdlib.h>
3
4 int main(){
5
6 typedef struct nodey{
7 int data;
8 struct nodey *next;
9 }node;
10
11 node m;
12 m.data = 350;
13 m.next = NULL;
14
15 node n;
16 n.data = 2;
17 n.next = &m;
18
19 printf("%d %d \n", m.data, n.next->data);
20 return 0;
21
22 }
似乎错误与编译器无法看到&amp; m按typedef名称有关。你能解释为什么这是一个错误吗?
答案 0 :(得分:3)
Typedef和结构具有不同的名称空间。引用结构时,必须以struct
关键字为前缀。
typedef struct {
int data;
struct node *next;
}node;
这定义了一个别名为node
的匿名结构。因此,定义了typdef node
,但尚未定义struct node
。但请注意,这有效地声明了struct node
而没有定义它。
如果您稍后执行n.next = &m
,则您尝试将node *
分配给struct node *
,这些不一样。
typedef struct nodey{
int data;
struct nodey *next;
}node;
这定义了一个名为struct nodey
的结构,并将node
声明为struct nodey
的别名。
答案 1 :(得分:2)
typedef struct {
int data;
struct node *next;
}node;
首先,struct node
还不是一件事,所以你在这里声明一个与struct node
不同的新node
类型。您的意思是仅使用node
吗?
其次,您无法在typedef
声明中使用struct
因为您仍然在定义新类型别名的过程中。也就是说,在struct
声明中,编译器尚未完成typedef
的处理。因此,如果您想在typedef
定义中使用struct
,则需要解开声明:
typedef struct nodey node;
struct nodey {
int data;
node *next;
};
(对于它的价值,在C ++中,struct
和class
声明会自动创建类型别名,这样的解开不是必需的。)