如何调用两次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; }
符合需求的验证说明
- 仅调用两次
calloc:分别用于分配结构体内存、字符串存储内存 - 仅调用一次
strncpy完成字符串拷贝,由于calloc会自动将申请的内存全部初始化为0,因此字符串最后一位默认是'\0',无需手动补结束符,字符串完全合法 - 额外新增了内存分配失败的判空逻辑,避免内存泄漏和空指针访问问题,不需要可以自行删除
内容的提问来源于stack exchange,提问作者Annie
相关产品推荐
相关产品推荐

