如何调用两个calloc并使用strncpy()来复制字符串



我被告知使用两个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),但现在lenstrlen(name) + 1。为了安全起见,我将把+1留在这里。过度分配很少有害处,但分配不足往往是一个严重的问题。

相关内容

  • 没有找到相关文章

最新更新