我有一个具有以下结构的程序:
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);
正如您所看到的,幻灯片结构的一个实例包含一个"第一"行结构,该行结构是一个双链表。该行的内容被读取到屏幕上(使用ncurses(
在程序循环中,用户可以键入命令:open filename
来打开一个新文件,这就是我的问题所在。
这些幻灯片和行应该被释放。当循环再次开始时,它将打开一个新文件,创建幻灯片和行,并将它们用作内容。但是,内容中有一部分是用垃圾文本填充的。我很确定这个问题是在行结构和它是如何免费的。然而,我并没有意识到我做错了什么。
编辑:我应该清楚地表明,在程序的第一次迭代中,文本是完美的,只有当我试图解析一个新文件时,垃圾文本才会出现,并且它是非常同质的(出现在每行的前面,相同的字符(
如果这有什么不同的话,我在Ubuntu上。
这里有一个项目链接:DSS
通过阅读您文章中的代码,我可以发现一些明显的问题。我不能确定这些是否是你的问题的原因,因为你帖子中的代码不是一个可编译的例子,我也没有深入研究你的链接项目。
您的下一行功能:
您忽略了设置n->下一个。
您还忽略了设置以下节点的prev指针(如果有(。(prev->next->prev if prev->next!=NULL(。
当前的设计使您无法使用此功能设置列表中的第一个节点。它也没有显示您打算如何创建该节点。
此函数不允许将节点添加到列表的开头。
您的createSlideArray函数:
此函数不会初始化它创建的幻灯片。必须初始化这些幻灯片实例。在这里做这件事似乎很明智,但你可能有充分的理由在其他地方做。无论哪种情况,初始化slideObject.first成员都至关重要。如果没有这一点,您将无法判断幻灯片是否有行列表,并且您的freeLines函数将失败,因为它将作为参数被垃圾传递。
注意:
实现双链接列表的另一种方式是使用始终存在并链接到列表中第一个和最后一个节点的"头节点"。这简化了一些问题,但改变了其他问题。如果你感兴趣,你可以研究一下。
我只需正确调用memset
就可以解决这个问题。对于线路,我能够做到以下几点:
memset(l, 0, sizeof(*l));
重要的是,要获取l指针处值的大小,而不是指针本身的大小,否则将无法正确释放内存。这就是我所面临的问题。