[英]C program doesn't work all the times i run it
我有以下代码,并且在我每次运行它时都无法正常工作:
🍻 🐢 ->> ./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);
}
此行为有一些未定义的行为:
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
指针作为数组,事实并非如此。 它只是1个对象,分配在堆上。 如果你真的要追加到的内存,并且您存储随时间增长的数据,那么你应该考虑使用链表,或者至少是: realloc
每次添加一个元素时的记忆。
使用您拥有的类似godlike
指针进行操作的主要问题是它是static
,并且函数的作用域在同一时间。 您将对其进行分配,但只能在该函数中访问它,并且该函数永远不会 free
内存。 这意味着您分配的内存将在应用程序运行期间一直保持分配状态(有效地表现为运行时内存泄漏)。 如果使用列表或使用realloc
,则每次调用该函数时,内存使用量都会增加,并且直到程序退出,内存才会释放。 由于这个原因,任何分析代码的工具(如valgrind)都会将此功能标记为潜在的内存泄漏。
您的代码中存在主要问题:
godlike
被分配为指向由malloc()
分配t_gnl
初始化的单个结构t_gnl
。
您访问尚未初始化的成员
i
,就可以访问第一个以外的尚未分配的元素。 如前所述,该代码具有未定义的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.