c - 我正在编写代码,我们在其中创造人类,让他们成为家庭并打印他们的信息,但我无法打印它
问题描述
基本上,我制作了一个包含一个人信息的结构。当我创建它们时,我会跳到我的另一个函数中,该函数应该打印它们的信息,但我被困在了这一点上。
这是我调用函数的主要部分:
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);
}
解决方案
您的构造函数应该为 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
,因为它确保了一个以空字符结尾的字符串不会溢出内存。
推荐阅读
- excel - 用于从包含在特定文件夹中的工作簿中导入工作表的 VBA 代码
- javascript - 使用 javascript 附加到引导表
- haskell - 避免在 GHCI 中出现不适当的非详尽模式匹配警告
- network-programming - 在 CodenameOne 中,ConnectionRequest.setTimeout 的参数是毫秒还是秒?
- python - Flask 和 Python,尝试从表单读取时不允许使用方法
- java - 从 csv 文件设置父 ID
- ios - 如何在 Swift 4.2 中编写键盘通知?
- python - 在 Python 中测试后备导入
- python - Python / SQL将多个变量插入参数并具有多个参数
- three.js - BufferGeometry 的完整船体形状