首页 > 解决方案 > 我正在编写代码,我们在其中创造人类,让他们成为家庭并打印他们的信息,但我无法打印它

问题描述

基本上,我制作了一个包含一个人信息的结构。当我创建它们时,我会跳到我的另一个函数中,该函数应该打印它们的信息,但我被困在了这一点上。

这是我调用函数的主要部分:

int main() 
{
    Person* p1 = person_constructor("Steven", 1970, "male");
    display_person(p1);
    return 0;
}

这是我构建人类的地方,我需要使用动态内存分配:

Person* person_constructor(char *name, int year_of_birth, char *sex)
{
    Person p = {};
    Person* pptr = &p;
    strcpy(p.name, name);
    p.year_of_birth = year_of_birth;
    strcpy(p.sex, sex);
    pptr = malloc(strlen(p.name) * sizeof(char) + strlen(p.sex) * sizeof(char) + sizeof(int));
    return pptr;
}

这是无法打印出名称的打印功能:

void display_person(Person* p)
{
    printf("%s",p->name);
}

标签: c

解决方案


您的构造函数应该为 person 对象分配内存,然后按以下顺序初始化分配的内存:

Person* person_constructor(char *name, int year_of_birth, char *sex)
{
    Person *p = malloc(sizeof(*p));

    if (p) {
        snprintf(p->name, sizeof(p->name), "%s", name);
        p->year_of_birth = year_of_birth;
        snprintf(p->sex, sizeof(p->sex), "%s", name);
    }

    return p;
}

调用构造函数的代码也必须在使用后释放内存:

int main(void)
{
    Person* p1 = person_constructor("Steven", 1970, "male");

    if (p1) {
        display_person(p1);
        free(p1);
    }

    return 0;
}

评论:

  • 根据对象的大小进行分配。您没有显示 person 结构的定义,但两个字符串字段似乎是固定大小的数组,因此sizeof(struct Person)已经包含它们。
  • 我使用snprintf了而不是strcpy,因为它确保了一个以空字符结尾的字符串不会溢出内存。

推荐阅读