基本上,我制作了一个包含个人信息的结构。当我创建它们时,我会跳到我的另一个功能中,该功能应该打印它们的信息,但我被困在了这一点上。
这是我调用函数的主要位置:
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;
}
另外,别忘了检查空间是否真的动态分配了