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

自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:57:02