C:即使在释放结构之后,程序也会打印垃圾文本

C:即使在释放结构之后,程序也会打印垃圾文本,c,memory-management,struct,malloc,free,C,Memory Management,Struct,Malloc,Free,我有一个具有以下结构的程序: typedef struct slide { int number; int maxX; int y; int r, g, b; struct line *first; } slide; typedef struct line { char content[256]; // number subject to change int r, g, b; struct line *prev; str

我有一个具有以下结构的程序:

typedef struct slide
{
    int number;
    int maxX;
    int y;
    int r, g, b;
    struct line *first;
} slide;

typedef struct line {
    char content[256]; // number subject to change
    int r, g, b;
    struct line *prev;
    struct line *next;
} line;
使用以下代码创建这些结构的实例:

slide* createSlideArray(int s) {
    slide* slides = malloc(sizeof(struct slide)*s);
    return slides;
}

line *nextLine(line *prev) {
    line *n = malloc(sizeof(line));
    n->prev = prev;
    prev->next = n;
    return n;
}
最后,这里是在程序循环完成后,在打开新文件之前释放结构的代码:

void freeLines(line *l) {
    line *next;
    while(l) {
        next = l->next;
        free(l);
        l = next;
    }
}
大体上:

int i;
for (i=0;i<slideCount;i++) {
    freeLines(slides[i].first); // works through next till NULL
}
free(slides);
inti;

对于(i=0;i我可以从阅读你文章中的代码中发现一些明显的问题。我不能确定这些问题是否与你的问题有关,因为你文章中的代码不是可编译的示例,我没有深入研究你的链接项目

您的下一行功能

您忽略了设置n->next

您还忽略了设置以下节点的上一个指针(如果有)(上一个->下一个->上一个,如果上一个->下一个!=NULL)

当前设计禁止您使用此功能设置列表中的第一个节点。它也不显示您打算如何创建该节点

此函数不允许将节点添加到列表的开头

您的CreateSliderray函数:

此函数不会初始化它创建的幻灯片。必须初始化这些幻灯片实例。在此处执行此操作似乎是明智的,但您可能有很好的理由在其他位置执行此操作。在这两种情况下,初始化slideObject.first成员都是至关重要的。否则,您将无法判断幻灯片是否有行列表,并且您需要r freeLines函数将失败,因为它将作为参数传递垃圾

注意:


实现双链接列表的另一种方法是使用“头节点”它始终存在,并链接到列表中的第一个和最后一个节点。这简化了一些问题,但改变了其他问题。如果您感兴趣,可以对此进行研究。

阅读您文章中的代码,我可以发现一些明显的问题。我无法确定这些问题是否与您文章中的代码一样对您的问题负责不是一个可编译的例子,我也没有深入研究你的链接项目

您的下一行功能

您忽略了设置n->next

您还忽略了设置以下节点的上一个指针(如果有)(上一个->下一个->上一个,如果上一个->下一个!=NULL)

当前设计禁止您使用此功能设置列表中的第一个节点。它也不显示您打算如何创建该节点

此函数不允许将节点添加到列表的开头

您的CreateSliderray函数:

此函数不会初始化它创建的幻灯片。必须初始化这些幻灯片实例。在此处执行此操作似乎是明智的,但您可能有很好的理由在其他位置执行此操作。在这两种情况下,初始化slideObject.first成员都是至关重要的。否则,您将无法判断幻灯片是否有行列表,并且您需要r freeLines函数将失败,因为它将作为参数传递垃圾

注意:


实现双链接列表的另一种方法是使用“头节点”它始终存在,并链接到列表中的第一个和最后一个节点。这简化了一些问题,但改变了其他问题。如果您感兴趣,可以对此进行研究。

我可以通过正确调用
memset
来解决此问题。对于行,我可以执行以下操作:

memset(l,0,sizeof(*l));


获取l指针上的值的大小,而不是指针本身的大小,这一点很重要,否则将无法正确释放内存。这就是我所面临的问题。

我可以通过正确调用
memset
来解决此问题。对于行,我可以执行以下操作:

memset(l,0,sizeof(*l));


获取l指针上的值的大小,而不是指针本身的大小,这一点很重要,否则将无法正确释放内存。这是我面临的问题。

NOTE
malloc
not
free
“清除”内存中以前的数据。我尝试使用
memset
清除内存,但似乎没有帮助(除非我只是用错了)如果我能改进代码,我完全支持更改代码。我2周前才开始学习C,所以一切都有帮助。很抱歉,但我怀疑是否有人会在github上浏览您的项目。欢迎您作为新的贡献者来到这里,您可能会从中受益阅读时请张贴问题所在。嗯,我想我需要重新修改我的问题?谢谢你的链接。我稍后会阅读这些链接,看看我是否能发布一个更好的版本,我问过。没有
malloc
不需要
free
“清除”内存中以前的数据。我尝试使用
memset
清除内存,但似乎没有帮助(除非我只是用错了)如果我能改进代码,我完全支持更改代码。我2周前才开始学习C,所以一切都有帮助。很抱歉,但我怀疑是否有人会在github上浏览您的项目。欢迎您作为新的贡献者来到这里,您可能会从中受益阅读请在问题中发布显示问题的。嗯,我想我需要修改我的问题?谢谢你的链接。我稍后会通读它们,看看我是否可以发布我所问的更好的版本。嗨,阿维,谢谢你花时间回答我的问题。我应该注意到我实际上是“手动”的启动第一行,然后在我使用下一行函数填充其他行后,将每一行都放在那里。当我到达行的末尾时,我只需将下一行/上一行的值设置为最后一行,然后