(我很抱歉这个模糊的标题,我真的不知道该放什么。)
我写了this C program作业。我花了四个多小时尝试调试它,但我是C的新手。我不是要求调试/修复程序,请继续阅读。
我的代码
struct olnode {
int eventnr;
int eventfq;
struct olnode *next;
};
typedef struct olnode olnode;
void srchfreq(olnode *list, int xfrequency, olnode **new)
{
olnode **previous;
**previous = NULL;
}
错误:错误:从类型'void *'分配类型'olnode'时出现不兼容的类型
**上一个= NULL;
该程序的要点是它应该采用随机数eventnr
,确定它是否已经在有序列表*list
中(其类型为olnode
的节点),然后要么a)如果它不存在则将其添加到列表的末尾,或者b)如果存在则更新频率eventfq
。 (该列表需要进行自我调整,并按最频繁到最不频繁的顺序排列。如果多个数字具有相同的频率,则具体顺序无关紧要。)
我的问题是,每次srchfreq()
运行时,srchevent()
都会在下次运行时导致无限循环。我从朋友那里插入了一些代码作为我的srchfreq()
函数(上面链接中的代码),但是在我的计算机和Ideone上它将无法编译,因为我在第149行初始化**previous = NULL;
我的朋友,使用完全相同版本的gcc,没有得到那个错误。我们的srchfreq()
函数是相同的,我们都在Windows 7上使用Cygwin。
所以,我的两个问题:
**previous = NULL;
会导致错误,而它在我朋友的机器上完美运作?srchfreq()
打破srchevent()
下一次迭代的问题?我使用gdb几个小时,无法找出问题所在。同样,主要问题是编译错误,如果问题得到解答,我会将问题标记为已回答。如果有人碰巧发现任何问题,那么第二个问题就是额外的问题,我不是要求调试整个代码。
答案 0 :(得分:1)
typeof(**previous)
为olnode
,您无法为其分配NULL
。
您可能想要:
previous = NULL;
答案 1 :(得分:0)
您的代码会创建一个名为previous
的变量,该变量是指向olnode
的指针。
olnode **previous;
**previous
的类型为olnode
。您的下一行代码尝试两次取消引用previous
,然后将NULL
存储在它获得的任何位置。这不起作用,因为previous
从未初始化。此外,编译器可能不知道如何将NULL
转换为olnode
类型,这解释了您收到的错误消息。
**previous = NULL; // won't work
您应该以这种方式初始化previous
:
olnode **previous;
previous = NULL;
或者这个:
olnode **previous = NULL;
关于您的第二个问题:在srchfreq
中,您从未将previous
设置为任何内容。然后,您尝试使用previous
在两个位置取消引用*previous
。这会导致分段错误,但我没有仔细查看你的代码,知道你应该如何改变它。
答案 2 :(得分:0)
正如其他答案中所指出的,您的代码错误地尝试将指针指针的内容设置为NULL,而不是指针指针本身。我将解释为什么它可能适用于某些编译器。
NULL宏的定义在字面上可以是C中的任何内容,只要它“扩展为实现定义的空指针常量”(C11 7.19)。
实际上,NULL几乎可以肯定地定义为
#define NULL 0
或
#define NULL (void*)0
根据编译器使用的格式,以及编译器的挑剔程度,int x = NULL;
等逻辑上不正确的表达式可能编译也可能不编译。因为int x = 0;
显然是完全有效的C,但int x = (void*)0;
是类型冲突。