我试着学习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);
}
答案 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)