我的函数get_next_line的泄漏内存

时间:2018-02-11 09:20:09

标签: c

我试着学习C语言。 我成功创建了一个逐行读取并将其返回给终端的程序。不幸的是,当我用valgrind检查时,我仍然有一些泄漏问题。你有一些提示吗?

#include "get_next_line.h"
#include "./libft/libft.h"

int     ft_check_error(char **line, char **stock, int fd)
{
    if (line == NULL || fd < 0 || BUFF_SIZE < 1)
        return (-1);
    if (!*stock)
    {
        if (!(*stock = ft_strnew(BUFF_SIZE + 1)))
            return (-1);
    }
    return (0);
}



char    *ft_read(char *stock, char *buf)
{
    char *tmp;

    tmp = stock;
    stock = ft_strjoin(stock, buf);
    ft_strdel(&tmp);

    return (stock);
}

int     get_next_line(const int fd, char **line)
{
    static  char    *stock[1024];
            char    buf[BUFF_SIZE + 1];
            int     ret;
            int     i;
if (ft_check_error(line, &stock[fd], fd) == -1)
    return (-1);

while ((ret = read(fd, buf, BUFF_SIZE)) > 0)
{
    buf[ret] = '\0';
    stock[fd] = ft_read(stock[fd], buf);
}
 i = 0;
 if (stock[fd][i])
{
    while (stock[fd][i] != '\n' && stock[fd][i])
        i++;
    *line = ft_strsub(stock[fd], 0, i);

    free(*line); 
    stock[fd] = &stock[fd][i + 1];
    return (1);
}
 if (ret == -1)
    return (-1);
    return (0);
}

这是主要功能:

int main(int ac, char **av)
{
    int     fd;
    char    *line;

    line = NULL;
    fd = open(av[ac-1], O_RDONLY);

    while (get_next_line(fd, &line) == 1)
    {
        printf(RED "\nResultat: \n" RESET);
        ft_putstr(line);
    }

    close(fd);
}

1 个答案:

答案 0 :(得分:1)

如果您需要传入双指针,那么您首先需要声明一个;

char *ptr
char **line

ptr = malloc(sizeof(?how much memory?)) 

line = &ptr

指向指针变量的指针可以保存另一个指针变量的地址。

然后在你的函数中,你使用双指针,并在你的函数中释放。

free(line)

请参阅How do pointer to pointers work in C?,了解关于双指针如何工作的非常好的答案

或者,

您可以在您的功能中分配内存,这将导致您进行最少量的更改

main

char **line;

然后;

int get_next_line(const int fd, char **line) {

    *line = malloc(sizeof(?how much memory?));

    free(*line)