我有以下代码,并且在我运行它时不能正常工作:
->> ./a.out gnl1_2.txt
1234567
abcdefg
->> ./a.out gnl1_2.txt
1234567
abcdefg
->> ./a.out gnl1_2.txt
1234567
它只返回第一行,有时候什么也没给我
(我可能有一些泄漏)。基本上它应该给我line
参数(godlike
=结构中具有字符串和文件描述符的文件)中的下一行
int get_next_line(const int fd, char **line)
{
static t_gnl *godlike;
int i;
i = 0;
if (fd < 0 || !line || !fd)
return (-1);
if (!godlike)
godlike = malloc(sizeof *godlike);
//printf("%s\n", godlike[0].xx);
while ((godlike[i].xx) && (godlike[i].fd != fd))
i++;
if (!godlike[i].xx)
{
godlike[i].fd = fd;
godlike[i].xx = read_f(fd);
if (godlike[i].xx == NULL)
return (-1);
}
*line = ft_strcdup(godlike[i].xx, '\n');
while ((godlike[i].xx[0]) && (godlike[i].xx[0] != '\n'))
{
godlike[i].xx[0] = '\0';
godlike[i].xx++;
}
if (godlike[i].xx[0] == '\n')
{
godlike[i].xx[0] = '\0';
godlike[i].xx++;
return (1);
}
else
return (0);
}
答案 0 :(得分:2)
这个中存在一些未定义的行为:
godlike = malloc(sizeof *godlike);
while ((godlike[i].xx) && (godlike[i].fd != fd))
i++;
您正在分配内存以容纳1 t_gnl
个对象。首先,while循环中的条件求值为:
while((godlike[0].xx) && (godlike[0].fd != fd))
这完全有效,相当于:
while(godlike->xx && godlike->fd != fd)
但是,因为从未初始化分配的内存,所以 可以保持为真,尤其是当知道godlike
具有静态存储时。每次调用该函数时,您的while条件都有可能成立,并最终评估类似
while((godlike[1].xx) && (godlike[1].fd != fd))
正在访问内存越界。
您似乎将godlike
指针用作数组,而不是。它只是一个在堆上分配的对象。如果你真的想要附加到那个内存,并且让你存储的数据随着时间的推移而增长,那么你应该考虑使用链表,或者至少每次添加一个元素时使用realloc
内存。
使用godlike
指针执行此操作的主要问题是它是static
,并且函数作用域同时存在。您将对其进行分配,但您只能在该函数中访问它,并且该函数永远不会 free
在内存中。这意味着只要应用程序运行,您分配的内存将保持分配状态(有效地表现为运行时内存泄漏)。如果使用列表或使用realloc
,每次调用函数时内存使用量都会增加,并且在程序退出之前内存不会被释放。任何分析像valgrind这样的代码的工具都会将此函数标记为潜在的内存泄漏。
答案 1 :(得分:0)
您的代码存在重大问题:
godlike
被分配为指向由t_gnl
分配的单个结构malloc()
并保持未初始化。
您访问尚未初始化的成员
i
,就可以访问第一个尚未分配的元素。发布时,代码有不确定的行为。