自制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
相关产品推荐
相关产品推荐

