1
typedef struct  {
 char name [25] ;
 char breed [25] ;
 int age  ; 
 struct animal *next ;
 } animal ;

 animal *ptr1 , *ptr2 , *prior ;
 ptr1 = (animal*)malloc( sizeof (animal) ) ;
 strcpy ( (*ptr1).name , "General" ) ;
 strcpy ( (*ptr1).breed , "Foreign breed" ) ;
 (*ptr1).age = 8 ;


 (*ptr1).next = NULL ;
 prior =ptr1 ;
 printf ("%s\n" , (*prior).name ) ;
 printf ("%s\n" , (*prior).breed ) ;
 printf ("%d\n" , (*prior).age ) ;
 printf ("%p\n" , (*prior).next ) ;
 free (ptr1) ;
 ptr1 = (animal*)malloc( sizeof (animal) ) ;
 strcpy ( (*ptr1).name , "General 1" ) ;
 strcpy ( (*ptr1).breed , "Abroad breed" ) ;
 (*ptr1).age = 24 ;
 (*ptr1).next = NULL ;
 (*prior).next = ptr1 ;

这是绘制链表的代码。执行时的整个代码在最后一行显示错误:

在函数'main'中:警告:来自不兼容指针类型的赋值[默认启用]

4

5 回答 5

1

将您的结构定义更改为此

typdef struct Animal_
{
  char name [25];
  char breed [25];
  int age; 
  struct Animal_* next;
} Animal;

没有Animal_结构是匿名结构,不能有指向它的指针。

于 2012-09-17T10:48:17.113 回答
1

将您的声明更改为:

typedef struct animal {
    char name [25] ;
    char breed [25] ;
    int age;
    struct animal *next;
 } animal;

结构标记animal已添加到声明中。您现在拥有类型animal的别名struct animal

于 2012-09-17T10:49:16.083 回答
0

这实际上是一个警告,而不是错误。我不明白你为什么使用 (*s).m 而不是 s->m。它更简单,更自然。我没有在您的代码中看到函数 main 以及出现错误的行,我想除了结构声明之外的所有代码都是函数 main。尝试像这样声明您的结构(您可能还需要添加“typedef struct animal”,具体取决于您的编译器): struct animal { ... animal *next; };

于 2014-01-15T05:46:53.193 回答
0

“标记”名称空间(在 之后的名称struct)和标识符名称空间(例如,您用 声明的名称空间typedef)在 C 中是不同的。

我发现,最简单的方法是始终向前声明struct标签并typedef一次性声明:

typedef struct animal animal;

从那时起,您typedef甚至可以在以下声明中轻松使用该名称struct

struct animal {
  ....
  animal* next;
};
于 2012-09-17T12:09:05.047 回答
0

animal是 typedef 的名称,而不是结构的名称。试试这个:

typedef struct _animal {
    char name [25];
    char breed [25];
    int age; 
    struct _animal *next;
} animal;
于 2012-09-17T10:47:15.340 回答