gpt4 book ai didi

c - 我的函数 get_next_line 泄漏内存

转载 作者:行者123 更新时间:2023-11-30 14:50:51 29 4
gpt4 key购买 nike

我尝试学习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);
}

最佳答案

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

char *ptr
char **line

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

line = &ptr

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

然后在您的函数中使用双指针,并在函数中使用 free 。

free(line)

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

或者,

您可以在函数内分配内存,这将使您的变化量最小

char **line;

然后;

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

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

free(*line)

关于c - 我的函数 get_next_line 泄漏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48730034/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com