在C中初始化指向NULL的指针

时间:2015-02-03 04:49:07

标签: c debugging gcc cygwin

(我很抱歉这个模糊的标题,我真的不知道该放什么。)

我写了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几个小时,无法找出问题所在。

同样,主要问题是编译错误,如果问题得到解答,我会将问题标记为已回答。如果有人碰巧发现任何问题,那么第二个问题就是额外的问题,我不是要求调试整个代码。

3 个答案:

答案 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;是类型冲突。