【问题标题】:Segmentation fault (core dumped) - strlcpy function C分段错误(核心转储) - strlcpy 函数 C
【发布时间】: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

【问题讨论】:

  • 不能写入字符串文字,如@9​​87654324@
  • 您似乎将"hello" 作为目标字符串传递?您是否尝试过使用其他内存 - 在堆或堆栈上分配的内存?
  • jsize之间的关系:后者可能比前者大很多,然后你就会越界访问内存。
  • 当您像以前一样传递字符串文字时,编译器会在数据只读部分中分配它。 这部分是只读的!因此是信号故障。如果要编辑(写入)字符串,请将其分配到堆栈(char foo[24])或堆上(使用malloc
  • 真的,感谢您的回复。似乎只是一个疏忽。

标签: c undefined-behavior c-strings string-literals function-definition


【解决方案1】:

你声明了一个指向字符串字面量的指针

char *str;

str = "byes";

字符串字面量不能更改。但是您正在尝试更改指向的字符串文字

str[3] = '\0';

这会导致未定义的行为。

删除此声明。字符串文字已经包含索引等于 4 处的终止零。

也在本次通话中

printf("%u", ft_strlcpy("hello", str, 5));

您再次尝试使用函数ft_strlcpy 更改字符串文字。在这种情况下,它是字符串文字"hello"

例如声明一个字符数组

char dsn[] = "hello";

并将其作为参数传递给函数

printf("%u", ft_strlcpy( dsn, str, sizeof( dsn )));

【讨论】:

  • @4386427 我没有专心。我以为字符串文字是":bye".:)
  • @4386427 也许吧。它不是标准功能。但对我来说,这在逻辑上是不一致的。
  • @VladfromMoscow size 等于 0 时的返回值似乎是试图复制的字符串的值,如手册中所述。无论如何,感谢您的回复:)
  • @IkerTejero 我注意到您“接受”了答案。你也可以考虑投票。
  • @4386427 不幸的是没有足够的声誉:(。一旦我能够做到,我肯定会支持它。
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 2017-02-25
  • 2016-07-12
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多