实现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
相关产品推荐
相关产品推荐

