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

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实现逻辑存在缺陷

    1. 循环判断顺序错误:当前逻辑先执行*dest++ = *src++再判断n--,当入参n=0时会先执行一次非法写入,需将n的判断前置,且保证最多只拷贝n次
    2. 未符合strncpy的标准要求:标准strncpy规定如果源字符串长度小于n,需要在目标字符串的剩余位置补'\0'直到填满n个字符,当前实现遇到源字符串的结束符就直接终止,缺少补零逻辑
    3. 函数声明返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:15:06