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

实现strlcpy函数时遇Segmentation fault (core dumped)错误求助

帮你解决strlcpy实现中的Segmentation Fault问题

嘿,我来帮你揪出这个段错误的根源!你的ft_strlcpy函数逻辑本身没啥大毛病,但main函数里的两个致命操作直接触发了内存访问错误,咱们一步步拆解:

问题1:修改字符串常量导致未定义行为

你在main里写了这段代码:

char *str;
str = "byes";
str[3] = '\0';

这里的"byes"是字符串常量,它被存在程序的只读数据段里。用char*指向它后试图修改其中的字符,这是C语言严格禁止的——操作系统会直接拦截这种非法内存写入,触发段错误。

如果要修改字符串,得把它放到可写内存中,比如用数组声明:

char str[] = "byes"; // 此时str是栈上的可写数组,内容可以修改
str[3] = '\0';

问题2:向字符串常量写入导致段错误

你调用ft_strlcpy("hello", str, 5)时,第一个参数"hello"也是字符串常量,而ft_strlcpy的dst参数是用来接收写入数据的目标地址。往只读的字符串常量里写数据,这必然会触发内存访问错误。

解决方法是定义一个可写的目标数组:

char dst[10] = "hello"; // 栈上的可写数组,作为目标地址
printf("%u", ft_strlcpy(dst, str, 5));

修正后的完整代码

#include <string.h>
#include <stdio.h>
#include <bsd/string.h>

// 建议给src加上const修饰,明确不会修改源字符串,更规范
unsigned int ft_strlcpy(char *dst, const char *src, unsigned int size) {
    unsigned int i;
    unsigned int j;
    j = 0;
    while (src[j] != '\0')
        j++;
    if (size == 0)
        return (j);
    i = 0;
    while (i < (size - 1) && src[i] != '\0') {
        dst[i] = src[i];
        i++;
    }
    dst[i] = '\0';
    return (j);
}

int main() {
    // 用数组存储可修改的字符串
    char str[] = "byes";
    str[3] = '\0';
    printf("%s\n", str);
    
    // 定义可写的目标数组
    char dst[10] = "hello";
    unsigned int len = ft_strlcpy(dst, str, 5);
    printf("Copied length: %u\n", len);
    printf("Modified dst: %s\n", dst);
    return (0);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 21:32:51