You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调用两次calloc并使用strncpy()完成字符串复制的实现方法

代码修改方案

原代码问题说明

  • 直接修改了传入参数name的指针指向,丢失了输入的原始字符串地址,后续没有用到实际的输入内容
  • strdup内部会调用malloc额外分配内存,不符合仅调用两次calloc的要求
  • 第一次给name分配的内存没有被有效使用也没有释放,存在内存泄漏问题

符合要求的修改后代码

Person_t* newPerson(char* name, int age, double height)
{
    // 计算输入字符串的实际长度(不含结尾'\0')
    size_t name_len = strlen(name);
    // 第一次calloc:分配Person_t结构体内存,自动初始化为0
    Person_t* person = calloc(1, sizeof(Person_t));
    if (person == NULL) {
        return NULL;
    }
    // 第二次calloc:分配name字符串存储空间,多留1位放结尾'\0',自动初始化为0
    person->name = calloc(name_len + 1, sizeof(char));
    if (person->name == NULL) {
        free(person);
        return NULL;
    }
    // 调用一次strncpy完成字符串拷贝
    strncpy(person->name, name, name_len);
    // 结构体其他成员赋值
    person->age = age;
    person->height = height;
    return person;
}

符合需求的验证说明

  1. 仅调用两次calloc:分别用于分配结构体内存、字符串存储内存
  2. 仅调用一次strncpy完成字符串拷贝,由于calloc会自动将申请的内存全部初始化为0,因此字符串最后一位默认是'\0',无需手动补结束符,字符串完全合法
  3. 额外新增了内存分配失败的判空逻辑,避免内存泄漏和空指针访问问题,不需要可以自行删除

内容的提问来源于stack exchange,提问作者Annie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 17:39:04