我被告知使用两个calloc和一个strncpy()来完成任务。
Person_t* newPerson(char* name, int age, double height)
{
size_t len = strlen(name)+1;
name = calloc(len, sizeof(char));
Person_t* person = calloc(1, sizeof(Person_t));
person->name = strdup(name);
person->age = age;
person->height = height;
return person;
}
您正在丢弃"Billy"当将calloc
返回的值赋给name
时。在调用之前,name
指向字符串字面值"Billy"。调用之后,它指向已清空的内存。根据当前的问题,您只需要删除
name = calloc(...);
如果您想要calloc
,您需要将返回值赋给person->name
而不是name
。如:
person->name = calloc(len + 1, sizeof *person->name);
strncpy(person->name, name, len + 1);
或者将这两行替换为:
person->name = strdup(name);
(在此之前请确保您没有将name赋值给其他内容)
您不需要在strncpy
中使用len + 1
,因为calloc
已经写了零,所以不需要复制空终止符,但它没有害处。您肯定需要在调用中使用len + 1
来为空终止符分配空间。当然,您需要将分配的空间分配给person->name
,而不是name
,因为在这里将分配给name
将丢弃您试图复制的值。(注:问题经过编辑。以前,len
只是strlen(name)
,但现在len
是strlen(name) + 1
。为了安全起见,我将把+1
留在这里。过度分配很少有害处,但分配不足往往是一个严重的问题。