C程序在我运行它的所有时间都不起作用

时间:2017-02-26 12:16:16

标签: c memory-leaks

我有以下代码,并且在我运行它时不能正常工作:

     ->> ./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);
}

2 个答案:

答案 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,就可以访问第一个尚未分配的元素。

发布时,代码有不确定的行为。