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

animal構造体ではなく、typedefの名前です。代わりにこれを試してください:

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

「タグ」名前空間(の後にある名前struct)と識別子名前空間(typedefたとえば、で宣言するもの)は、Cでは区別されます。

私が見つけた最も簡単な方法は、常にstructタグを前方宣言しtypedef、一度に宣言することです。

typedef struct animal animal;

それ以降は、 :typedefの宣言内でも簡単に名前を使用できるようになります。struct

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

これは実際には警告であり、エラーではありません。なぜs->mの代わりに(* s).mを使用しているのかわかりません。それはより単純でより自然です。コードとエラーが発生した行に関数mainが表示されません。構造体宣言を除くすべてのコードが、関数mainであると思います。このように構造体を宣言してみてください(コンパイラによっては、「typedef structanimal」を追加する必要がある場合もあります)。structanimal {... animal * next; };

于 2014-01-15T05:46:53.193 に答える