在结构中定义指针

时间:2013-11-06 06:44:11

标签: c pointers struct

我创建了一个结构Person并且在其中包含了这些变量,然后我添加了一个名为father的新字段,其类型是指向一个人的指针。 我必须将FJames的数据初始化如下:fname = Whatever,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;

}

5 个答案:

答案 0 :(得分:1)

您实际上并未声明struct Person

您正在声明匿名结构并将其输入到人身上。然后,您应该将其仅用作Person,而不是struct Person

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

或者如果你想要typedef

typedef struct s_Person {
    struct s_Person *father
} Person;

答案 1 :(得分: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*。或者使用&

的地址

此代码还有其他一些问题,但是那个问题会给你带来错误。

答案 2 :(得分:0)

最后一行应该是

James.father = &FJames;

father字段是指针,但FJames是Person。您可以使用&获取FJames的地址。

修改

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

typedef struct s_Person {
    // ...
    struct s_Person *father;
} Person;

答案 3 :(得分:0)

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

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

答案 4 :(得分: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中定义)以注意您已正确退出。
  4. 建议:

    1. 取消引用James.father的属性时,请使用优先级和箭头表示法取消引用其值。
    2. 如果您使用gcc,请使用-Wall选项进行编译以启用所有编译警告。这将有助于记录需要更正的警告。