C语言自定义strlcat函数出现Segmentation Fault问题求助
问题分析与解决
段错误的核心原因
- 写入只读内存:调用
ft_strlcat时传递的第一个参数是字符串字面量"A very long",这类字符串在C中被存储在只读数据段(.rodata),尝试修改它的内容会直接触发段错误。必须使用可修改的字符数组作为目标缓冲区。
代码中其他致命问题
- 函数名不匹配:定义的函数是
ft_srlcat,但调用时写的是ft_strlcat,拼写错误会导致编译错误或未定义行为。 - main函数语法错误:
void main缺少括号(),且函数调用的参数写法完全错误,正确的调用格式应为ft_strlcat(dst, src, size),参数需放在括号内。 - 循环逻辑错误:
- 原循环条件
size > 0 || src[j] != '\0'完全不符合strlcat的设计逻辑,会导致无限循环或越界写入。strlcat的规则是:最多向目标缓冲区写入size - dst_len - 1个字符,最后必须追加'\0'。 - 未处理目标字符串长度已大于等于
size的情况,此时应直接返回目标长度加源长度,不执行任何写入操作。
- 原循环条件
- 函数返回值问题:函数声明为
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
相关产品推荐
相关产品推荐

