自定义my_strdup函数使用malloc返回错误字符串、while循环无法终止如何修复?
自定义my_strdup函数问题修复方案
核心错误原因
- 用
sizeof(param_1)计算字符串长度是完全错误的:param_1是字符指针类型,sizeof运算得到的是指针本身的内存占用(32位环境下为4字节,64位环境下为8字节),和指针指向的字符串实际长度没有任何关系,直接导致内存申请大小错误。 - 没有为新字符串追加结束符
'\0':C语言中字符串以'\0'作为结束标记,缺少结束符会导致后续读取字符串时越界访问非法内存,出现结果乱码、循环无法终止、程序崩溃等未定义行为。 - 缺少空指针校验:没有判断入参
param_1是否为空,也没有校验malloc内存申请是否成功,存在潜在崩溃风险。
修复代码
版本1(依赖strlen库函数)
#include <stdlib.h> #include <string.h> char* my_strdup(char* param_1) { // 入参非空校验 if (param_1 == NULL) { return NULL; } // 计算字符串实际长度,+1用于存储结束符'\0' int str_len = strlen(param_1) + 1; char* p = (char*)malloc(sizeof(char) * str_len); // 内存申请失败校验 if (p == NULL) { return NULL; } int i = 0; while (i < str_len) { p[i] = param_1[i]; i++; } return p; }
版本2(不依赖库函数,自行计算长度)
#include <stdlib.h> char* my_strdup(char* param_1) { if (param_1 == NULL) { return NULL; } // 自行遍历计算字符串长度 int len = 0; while (param_1[len] != '\0') { len++; } char* p = (char*)malloc(sizeof(char) * (len + 1)); if (p == NULL) { return NULL; } // 复制内容直到遇到结束符,自动把'\0'也复制到新字符串 int i = 0; while ((p[i] = param_1[i]) != '\0') { i++; } return p; }
内容的提问来源于stack exchange,提问作者G'iyosiddin
相关产品推荐
相关产品推荐

