K&R练习5-5 自定义实现strncpy函数运行触发段错误问题求助
strncpy实现段错误问题排查
对只读内存执行写入操作
C语言中直接用char *指向的双引号包裹的字符串属于字符串字面量,存储在进程的只读内存段,禁止写入。你代码中s1指向字符串字面量"hello",向*dest(即s1指向的地址)写入内容直接触发段错误。
修复方式:将s1声明为可写入的栈上字符数组:char s1[] = "hello";调用printf时使用未定义变量
代码中printf("%s", t1);的变量t1未做任何声明,属于语法错误,此处你需要输出拷贝后的s1,改为printf("%s", s1);即可。strn_cpy实现逻辑存在缺陷
- 循环判断顺序错误:当前逻辑先执行
*dest++ = *src++再判断n--,当入参n=0时会先执行一次非法写入,需将n的判断前置,且保证最多只拷贝n次 - 未符合strncpy的标准要求:标准strncpy规定如果源字符串长度小于n,需要在目标字符串的剩余位置补
'\0'直到填满n个字符,当前实现遇到源字符串的结束符就直接终止,缺少补零逻辑 - 函数声明返回
void*但无返回值,若不需要返回值可将返回类型改为void,符合标准实现的话应返回目标字符串首地址
- 循环判断顺序错误:当前逻辑先执行
修复后完整代码
#include <stdio.h> char *strn_cpy(char *dest, const char *src, int n) { char *orig_dest = dest; // 拷贝最多n个字符,遇到src结束符也终止 while (n > 0 && (*dest++ = *src++)) { n--; } // 剩余位置补0 while (n > 0) { *dest++ = '\0'; n--; } return orig_dest; } int main() { char s1[] = "hello"; char *s2 = "abc"; strn_cpy(s1, s2, 2); printf("%s", s1); return 0; }
内容的提问来源于stack exchange,提问作者ggilad
相关产品推荐
相关产品推荐

