为什么typedef'ing导致错误的结构具有引用自身的字段?

时间:2016-09-27 03:19:16

标签: c struct typedef

我尝试更好地理解结构时遇到了一个奇怪的错误,我想更好地理解它。我试图创建一个小的链表而不使用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名称有关。你能解释为什么这是一个错误吗?

2 个答案:

答案 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 ++中,structclass声明会自动创建类型别名,这样的解开不是必需的。)