-3

我被告知使用两个 callocs 和一个 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;
    }
    

4

1 回答 1

1

当您将返回的值分配给callocto时,您将丢弃值“Billy” 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);  

(只需确保在执行此操作之前您没有为其他名称分配名称。)

你不需要使用len + 1strncpy因为calloc已经写了零,所以不需要复制空终止符,但这并没有什么坏处。您肯定需要len + 1在 calloc 中为空终止符分配空间。而且您当然需要将分配的空间分配给person->name,而不是name,因为分配给name此处会丢弃您尝试复制的值。(注意,问题已经过编辑。以前len只是strlen(name),但现在lenstrlen(name) + 1。为了安全起见,我将离开+1这里。过度分配很少会造成伤害,但分配不足通常是一个严重的问题。

于 2021-08-30T00:09:32.527 回答