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

自制C语言strcpy风格字符串拷贝函数出现异常输出求助

问题分析与解决

核心问题:数组越界导致内存覆盖

你遇到的name2变成空串的问题,根源是数组越界访问:

  • 定义char name1[] = "Rohit"时,数组会自动分配刚好容纳该字符串的空间——共6个字节(5个字符+末尾的\0终止符)。
  • name2的有效字符数是6(stringLen返回的是不含\0的长度),如果copyString要把name2的完整内容(包括\0)拷贝到name1,需要至少7个字节空间,但name1只有6个字节,触发了越界写入。
  • 栈上的局部变量是连续分配的,越界写入会覆盖相邻的name2内存,刚好把name2的第一个字符改成\0,所以输出时name2成了空串。

修复步骤

1. 给目标数组足够的空间

把name1的定义改成能容纳目标字符串的足够大小,比如:

char name1[20] = "Rohit"; // 分配足够大的空间,避免越界

2. 正确实现copyString函数

这里给出符合strcpy风格的两种实现方式:

  • 贴近标准strcpy的实现(无需手动传长度):
// 拷贝src字符串到dest,返回dest指针(和strcpy行为一致)
char* copyString(char *dest, const char *src) {
    char *temp = dest; // 保存目标指针初始位置
    // 逐个拷贝字符直到源字符串终止符
    while (*src != '\0') {
        *temp++ = *src++;
    }
    *temp = '\0'; // 给目标字符串添加终止符
    return dest;
}
  • 按指定长度拷贝的实现(需手动添加终止符):
void copyString(char *dest, const char *src, int len) {
    for (int i = 0; i < len; i++) {
        dest[i] = src[i];
    }
    dest[len] = '\0'; // 必须手动加终止符,否则字符串会乱码
}

3. 调用调整

如果使用第一种无需传长度的实现,main里的调用可以改成:

copyString(name1, name2);

这更贴近标准库strcpy的用法,也不需要自己计算长度。

额外注意点

  • 用const修饰源字符串指针(const char *src),能避免函数内误改源字符串,更符合C语言编码规范。
  • 你自己实现的stringLen是正确的,后续学习可以直接用标准库的strlen函数(需包含<string.h>)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 00:20:46