1

我创建了一个结构 Person 并在其中包含这些变量,然后我添加了一个名为 parent 的新字段,它的类型是指向人的指针。我必须将 FJames 的数据初始化如下: fname = 不管,lname = Bond,age = 80,job = Farmer,father = NULL

然后初始化詹姆斯的数据如下: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

您正在声明匿名结构并将其类型定义为人员。然后你应该把它当作just 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

最后一行应该是

James.father = &FJames;

father字段是一个指针,但 FJames 是一个Person. 可以&用来获取地址FJames

编辑

除此之外,还应该以 aragaer 建议的方式之一更改结构定义,例如:

typedef struct s_Person {
    // ...
    struct s_Person *father;
} Person;
于 2013-11-06T06:50:27.510 回答
0

James.father = &FJames 应该是你所需要的。

还有其他小问题。如今,从字符串常量初始化 char* 是不受欢迎的,因为 char* 意味着可以更改指向的内存。

于 2013-11-06T06:55:44.407 回答
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时应取消引用FJames,以便将其设置为指向的指针的值FJames
  3. 你的main()函数应该返回一个int,所以返回EXIT_SUCCESS(在 中定义stdlib.h)来说明你正确退出了。

建议:

  1. 取消引用 的属性时James.father,使用优先级和箭头符号来取消引用其值。
  2. 如果您正在使用gcc,请使用-Wall选项进行编译以启用所有编译警告。这将有助于注意需要更正的警告。
于 2013-11-06T07:02:45.300 回答