C Memset覆盖另一个数组

C Memset覆盖另一个数组,c,C,我在使用memset函数时遇到了一个问题(预实现的和我自己创建的) 以下是我遇到问题的代码: static char *ft_trim(char *input) { char *res; ft_putendl(input); // Here I check my input string. res = ft_strnew(5); ft_memset(res, '0', 5); // I tried using memset(res, '0', 5);

我在使用memset函数时遇到了一个问题(预实现的和我自己创建的)

以下是我遇到问题的代码:

static char *ft_trim(char *input)
{
    char    *res;

    ft_putendl(input);   // Here I check my input string.
    res = ft_strnew(5);
    ft_memset(res, '0', 5); // I tried using memset(res, '0', 5);   same result
    res[5] = '\0';
    ft_putendl(input);   // Second check
我想要的是有res类似于“00000”的东西。这些行做得很好,但同时memset似乎正在我的输入链中写入。我的输出如下:

lllllaarararttttRRR
lllllaararartttt00000
第一个输入提示没有问题,但在第二个提示中,我丢失了一些数据

如果需要答案,以下是我的ft\u memset代码:

void    *ft_memset(void *b, int c, size_t len)
{
    char                    *str;
    unsigned long int       i;

    str = (char*)b;
    i = 0;
    while (i < len)
    {
        str[i] = c;
        i++;
    }
    return (b);
}
为了以防万一,ft\u strcr

void    ft_strclr(char *s)
{
    int i;

    i = 0;
    while (s[i] != '\0')
    {
        s[i] = '\0';
        i++;
    }
}
ft_putendl

void    ft_putendl(char const *s)
{
    ft_putstr(s);
    write(1, "\n", 1);
}
ft\u putstr

void    ft_putstr(char const *s)
{
    int i;

    i = 0;
    while (s[i] != '\0')
    {
        ft_putchar((char)s[i]);
        i++;
    }
}
void    ft_putchar(char c)
{
   write(1, &c, 1);
}
ft_putchar

void    ft_putstr(char const *s)
{
    int i;

    i = 0;
    while (s[i] != '\0')
    {
        ft_putchar((char)s[i]);
        i++;
    }
}
void    ft_putchar(char c)
{
   write(1, &c, 1);
}
至于main,我的代码放在一个函数中,类似于3层函数调用(main调用调用调用这一部分的函数)*输入是ft_strnew(int)的结果,通过逐字符复制逐渐填充

就上下文而言,关于上述字符*的唯一部分如下:

*origin being a string from **argv

tmp = ft_strnew(/*an int I get*/);
i = 0;
while (*origin)
{
    if (ft_isalpha(*origin) != 0)
    {
        tmp[i] = *origin;
        i++;
    }
    origin++;
}
从那里我发送*tmp,这是在post中看到的较高的*input

OP
ft_strnew()
调用
ft_strcr()
,它无法修复,因为它不限制它的迭代计数(最大和最小意义),当与ft_strnew()一起使用时,它读取未初始化的内存

建议:

char *ft_strnew(size_t length) {
  return calloc(length + 1, 1);  // calloc zero fills the allocated memory
}

看起来,
ft\u strnew
返回的地址不正确。如果
printf(“%p-%p”,输入,res),会发生什么情况
?@András Cottier如果分配了一个5个字符的数组,则此语句在数组res[5]='\0'之外写入;我猜函数调用
ft_strnew(5)分配5字节内存,您正在使用
res[5]='\0'写入未经授权的内存
@András Cottier Show function ft_strnewwell,
(size+1)
有一个隐式转换,因为
1
是一个
int
。如果您遵循自己的规则,您应该编写
(char*)(malloc(sizeof(char)*(size+(size_t)1))
。而且
return(0)
应该是
return((char*)0)
s[i]!='\0'
应该是
s[i]!=(char)'\0'
,和
str[i]=c应该是
str[i]=(char)c
ft_memset(res'0',5)应为
ft_memset((void*)res,'0',(size_t)5)谢谢你的建议,我做了更改。尽管如此,主程序仍然没有改变。@OP
ft_putendl()
main()
没有发布,所以我无法帮助。如果我没有自己重新编写libc函数,我就无权使用它们。@András Cottier因为我缺乏洞察力,我不知道哪些函数被授权了。如果没有列表,很难判断允许什么。对于这个项目(recode shell command
ls
),我可以使用write、opendir、readdir、closedir、stat、lstat、getpwuid、getgrgid、listxattr、getxattr、time、ctime、readlink、malloc、free、peror、strerror、exit。虽然我认为问题不在我的库中,而在我的代码中。但是,如果你真的想在这里引导完整的代码,我可以发布它-但我相信其中会有很多新的错误或优化的可能性,我不想被冲昏头脑。