1

構造体 Person を作成し、その中にこれらの変数を入れた後、father という名前の新しいフィールドを追加しました。その型は人へのポインターです。FJames のデータを次のように初期化する必要があります: fname = 何でも、lname = Bond、age = 80、job = Farmer、father = NULL

次に、James のデータを次のように初期化します: fname = James、lname = Bond、age = 40、job = Actor、father = FJames

次に、すべてのデータを表示します。「互換性のない型 "Person" の式で struct Person * を初期化しています。

/#include <stdio.h>

typedef struct {
    int age;
    char *fname;
    char *lname;
    char *job;
    struct Person *father;
}Person;

int main(int argc, const char * argv[])
{

    Person James;
    Person FJames = {80,"Whatever","Bond","Painting",NULL};
    James.age = 40;
    James.fname = "James";
    James.lname = "Bond";
    James.job = "Engineering";
    James.father = FJames;

}
4

5 に答える 5

1

struct Personあなたは実際に宣言しません。

あなたは匿名構造を宣言していて、それを人に型定義しています。Personその場合、 ではなくただ として使用する必要がありますstruct Person

struct Person {
    struct Person *father; // this will work
}

または、typedefが必要な場合

typedef struct s_Person {
    struct s_Person *father
} Person;
于 2013-11-06T06:53:44.250 に答える
0
typedef struct {
    int age;
    char *fname;
    char *lname;
    char *job;
    struct Person *father; // << This is a pointer to a Person
} Person;


James.father = FJames;

FJamesではありませんPerson*。彼はPerson. mallocを取得するには、彼に連絡する必要がありPerson*ます。または彼の住所を取る&

このコードには他にもいくつかの問題がありますが、それが問題のエラーを引き起こしている問題です。

于 2013-11-06T06:47:33.303 に答える
0

ここに作業プログラムがあります:

#include <stdio.h>
#include <stdlib.h>

typedef struct Person {
    int age;
    char *fname;
    char *lname;
    char *job;
    struct Person *father;
} Person;

int main(int argc, const char * argv[])
{

    Person James;
    Person FJames = {80,"Whatever","Bond","Painting",NULL};
    James.age = 40;
    James.fname = "James";
    James.lname = "Bond";
    James.job = "Engineering";
    James.father = &FJames;

    fprintf(stdout, "%d\t%s\t%s\t%s\tpops:\t%s\t%s\n", James.age, James.fname, James.lname, James.job, (James.father)->fname, (James.father)->lname);

    return EXIT_SUCCESS;
}

訂正:

  1. typedefを宣言するように修正する必要がありますPerson
  2. 設定するときは、へのポインターの値に設定するようにJames.father逆参照する必要があります。FJamesFJames
  3. 関数main()は を返す必要があるintため、EXIT_SUCCESS(で定義されてstdlib.hいる) を返して、適切に終了したことを確認します。

アドバイス:

  1. のプロパティを逆参照する場合はJames.father、優先順位と矢印表記を使用してその値を逆参照します。
  2. を使用している場合は、オプションを指定してgccコンパイルし-Wall、すべてのコンパイル警告を有効にします。これは、修正が必要な場所を指摘する警告に注意するのに役立ちます。
于 2013-11-06T07:02:45.300 に答える