C语言 我想直接制作strncpy函数,你能查看我的代码吗?存在总线错误



我想通过代码而不是使用库或标头来使strncpy函数

但是有zsh总线错误.....我的代码有什么问题?什么是 zsh 总线错误??

#include <stdio.h>
#include <string.h>
char    *ft_strncpy(char *dest, char *src, unsigned int n)
{
unsigned int    i;
i = 0;
while (i < n && src[i])
{
dest[i] = src[i];
i++;
}
while (i < n)
{
dest[i] = '';
i++;
}
return (dest);
}
int main()
{
char         *A = "This is a destination sentence";
char         *B = "abcd";
unsigned int  n = 3;
printf("%s", ft_strncpy(A, B, n));
}

你对strncpy的实现很好,容易出错的函数的不可思议的语义得到了正确的实现(除了n的类型,它应该是size_t(。

您的测试函数不正确:您将字符串常量的地址作为目标数组传递,ft_strncpy()尝试写入时会导致未定义的行为。不得写入字符串常量。编译器可能会将它们放在只读内存中(如果可用(。在系统上,写入只读内存会导致总线错误,如 shell 所报告的那样。

下面是一个以本地数组为目标的修改版本:

int main()
{
char          A[] = "This is a destination sentence";
const char   *B = "abcd";
unsigned int  n = 3;
printf("%sn", ft_strncpy(A, B, n));
return 0;
}

您的代码公开了数组和指针之间C的细微差异之一。该行:

char *A = "This is a destination sentence";

A声明为指向字符(字符串(的指针,然后将该指针初始化为字符串文本的地址。此字符串文本是一个常量值,允许编译器将其放置在只读的内存区域中。然后,当您将该内存传递给ft_strncpy函数(通过其地址(时,您正在尝试修改该只读内存。

如果您,请改为使用以下方法:

char A[] = "This is a destination sentence";

然后,您将A声明为字符数组,并使用字符串文本中的数据初始化该数组。因此,编译器现在知道数组是可修改的(您尚未包含const限定符(,并将该数组放在可以读取写入的内存中。

相关内容

  • 没有找到相关文章

最新更新