【发布时间】:2020-12-08 17:51:48
【问题描述】:
我一直在构建一些基本的 C 函数,但我还是不太有经验。
在编写 strlcpy 函数时,我不断收到 Segmentation fault (core dumped) 错误。认为它可能与 NUL 终止字符串有关,但我在运行时不断收到错误。
任何帮助将不胜感激,在此先感谢。
#include <string.h>
#include <stdio.h>
#include <bsd/string.h>
unsigned int ft_strlcpy(char *dst, 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;
str = "byes";
str[3] = '\0';
printf("%s", str);
printf("%u", ft_strlcpy("hello", str, 5));
return (0);
}
修正功能以防有人需要
unsigned int ft_strlcpy(char *dst, 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";
char dest[] = "hello";
printf("%s\n", str);
printf("%u\n", ft_strlcpy(dest, str, 5));
printf("%s\n", dest);
return (0);
}
应该返回:
byes
4
byes
【问题讨论】:
-
不能写入字符串文字,如@987654324@
-
您似乎将
"hello"作为目标字符串传递?您是否尝试过使用其他内存 - 在堆或堆栈上分配的内存? -
看
j和size之间的关系:后者可能比前者大很多,然后你就会越界访问内存。 -
当您像以前一样传递字符串文字时,编译器会在数据只读部分中分配它。 这部分是只读的!因此是信号故障。如果要编辑(写入)字符串,请将其分配到堆栈(
char foo[24])或堆上(使用malloc) -
真的,感谢您的回复。似乎只是一个疏忽。
标签: c undefined-behavior c-strings string-literals function-definition