我正在制作一个代码,我们创造人类,让他们成为家庭并打印他们的信息,但我无法打印它



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

这是我调用函数的主要位置:

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_constructor()严重混淆。您将pptr设置为指向p,只是用指向未初始化的动态内存块(大小确定错误(的指针覆盖它。

// Allocate the structure memory
Person* pptr = malloc( sizeof(Person) ) ;
// Assign the structure members
strcpy( pptr->name, name ) ;
pptr->year_of_birth = year_of_birth;
strcpy( pptr->sex, sex ) ;
// Return a pointer to the allocation
return pptr ;

构造函数应该为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,因为它确保了以null结尾的字符串不会溢出内存

修改@Observer代码使其更加安全,删除了不需要的代码

#define some_value1 64
#define some_value2 64
typedef struct 
{
char name[some_value1];
char sex[some_value2];
int  year_of_birth;
} Person;   
char *safe_strncpy(char *dest, const char *src, size_t length)
{
strncpy(dest, src, length -1);
dest[length - 1] = 0;
return dest;
}
Person *person_constructor(const char *name, const int year_of_birth, const char *sex)
{
Person *pptr;
pptr=malloc(sizeof(*pptr));
if(pptr)
{
safe_strncpy(pptr->name,name, sizeof(pptr->name));
safe_strncpy(pptr->sex,sex, sizeof(pptr->sex));
pptr->year_of_birth=year_of_birth;
}
return pptr;
}

将其简化为:

//ASSUMING PERSON IS LIKE THIS:
typedef struct person
{
char name[some_value1];
char sex[some_value2];
int  year_of_birth;
} Person;   

Person* person_constructor(char *name, int year_of_birth, char *sex)
{
Person *pptr;
pptr=malloc(sizeof(*pptr));
memset(pptr->name,'',sizeof(pptr->name));
memset(pptr->sex,'',sizeof(pptr->sex));
strcpy(pptr->name,name);
strcpy(pptr->sex,sex);
pptr->year_of_birth=year_of_birth;
return pptr;
}

另外,别忘了检查空间是否真的动态分配了

相关内容

  • 没有找到相关文章

最新更新