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

C语言自定义strlcat函数出现Segmentation Fault问题求助

问题分析与解决

段错误的核心原因

  • 写入只读内存:调用ft_strlcat时传递的第一个参数是字符串字面量"A very long",这类字符串在C中被存储在只读数据段(.rodata),尝试修改它的内容会直接触发段错误。必须使用可修改的字符数组作为目标缓冲区。

代码中其他致命问题

  1. 函数名不匹配:定义的函数是ft_srlcat,但调用时写的是ft_strlcat,拼写错误会导致编译错误或未定义行为。
  2. main函数语法错误:void main缺少括号(),且函数调用的参数写法完全错误,正确的调用格式应为ft_strlcat(dst, src, size),参数需放在括号内。
  3. 循环逻辑错误:
    • 原循环条件size > 0 || src[j] != '\0'完全不符合strlcat的设计逻辑,会导致无限循环或越界写入。strlcat的规则是:最多向目标缓冲区写入size - dst_len - 1个字符,最后必须追加'\0'。
    • 未处理目标字符串长度已大于等于size的情况,此时应直接返回目标长度加源长度,不执行任何写入操作。
  4. 函数返回值问题:函数声明为char *但未返回值,违反C标准,会引发未定义行为。标准strlcat返回的是目标字符串原长度与源字符串长度之和。

修正后的完整代码

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

// 匹配标准strlcat的参数与返回值逻辑,修正函数名
size_t ft_strlcat(char *dst, const char *src, size_t size) {
    size_t dst_len = 0;
    size_t src_len = strlen(src);
    size_t i = 0;

    // 计算目标字符串长度,同时避免越界访问
    while (dst_len < size && dst[dst_len] != '\0') {
        dst_len++;
    }

    // 目标缓冲区已满,直接返回总长度
    if (dst_len == size) {
        return dst_len + src_len;
    }

    // 追加源字符串,预留位置放终止符
    while (i < src_len && (dst_len + i + 1) < size) {
        dst[dst_len + i] = src[i];
        i++;
    }
    // 必须添加字符串终止符
    dst[dst_len + i] = '\0';

    return dst_len + src_len;
}

int main() {
    // 使用可修改的字符数组作为目标缓冲区,预留足够空间
    char dst[100] = "A very long";
    const char *src = "test to see if it works";
    size_t result = ft_strlcat(dst, src, sizeof(dst));

    printf("拼接后的字符串: %s\n", dst);
    printf("总长度(目标+源): %zu\n", result);
    return 0;
}

关键修复点说明

  • 用可修改的字符数组char dst[100]替代字符串字面量,确保有足够的可写内存空间。
  • 严格遵循strlcat的标准逻辑:计算目标长度、处理缓冲区不足的场景、追加字符后添加终止符、返回总长度。
  • 修正函数名、main函数的语法错误,使用size_t类型处理长度(符合C标准的无符号整数类型,避免负数问题)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:01:37