Memset覆盖另一个数组

时间:2016-03-15 20:00:01

标签: 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);   same result
    res[5] = '\0';
    ft_putendl(input);   // Second check

我想要的是 res 类似于“00000”。这些行做得很好,但同时memset似乎是在我的输入链中写的。我的输出如下:

lllllaarararttttRRR
lllllaararartttt00000

第一个输入提示是可以的,但是在第二个提示中我丢失了一些数据。

如果答案需要,这是我的 ft_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_strnew

char    *ft_strnew(size_t size)
{
    char    *str;

    if (!(str = (char*)(malloc(sizeof(char) * (size + 1)))))
        return (0);
    ft_strclr(str);
    return (str);
}

还有 ft_strclr ,以防万一。

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_putstr

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

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

ft_putchar

void    ft_putchar(char c)
{
   write(1, &c, 1);
}

至于main,我的代码放在一个函数中,类似于3层函数调用(main调用调用此部分调用的东西)。 *输入是ft_strnew(int)的结果,并通过char复制char逐渐填充。

至于上下文,关于所述char *的唯一部分在这里:

*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,这是在帖子中看得更高的*输入

1 个答案:

答案 0 :(得分:3)

OP ft_strnew()调用ft_strclr(),它不会被修复,因为它不会限制其迭代次数(在最大和最小意义上)以及与ft_strnew(), ft_strclr一起使用时()`它读取未初始化的内存。

推荐:

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