繁体   English   中英

C程序在我运行它的所有时间都无法正常运行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM