当定义包含参数时,调用不带参数的函数

时间:2015-08-09 12:34:59

标签: c function pointers call volatile

我试图运行一个用添加的-g标志编译的旧MUD驱动程序并删除-O2标志,以便我可以调试它。我有一个原型void try_to_swap(void)的函数,但定义是void try_to_swap(volatile int* interrupted)。在函数内部,检查该指针的值:

if(*interrupted)
    ...

该函数不带参数调用,如原型 - try_to_swap();

优化标志一切正常。但是如果没有它,我会在调用函数时得到SIGSEGV。问题是指针指向进程无法访问的地址(0x3b - 每次),因此分段错误。

我的问题是:

a)为什么我在制作过程中没有收到任何错误?不应该在编译器注意到调用中缺少参数吗?

b)在优化期间,编译器是否会以某种方式处理指针的值,以便程序不会崩溃?

c)解决这个问题的正确方法是什么?从definiton中删除指针,将其添加到原型中?指针仅在此函数中使用,并且仅在提及的if中使用。它似乎没有在任何地方初始化。或者它可能以某种方式自动初始化?我对volatile指针不太熟悉。但是指针值是函数调用之前的堆栈中的随机垃圾,因为没有提供参数值。这在C中是否合法,默认值不是一个选项?

1 个答案:

答案 0 :(得分:1)

a)在C中,()表示"任何参数"并且与(void)相同,这不是参数。 try_to_swap()有效,但不是用户的好文档。

b)是的,编译器似乎检测到缺少的参数,只是传递一个空指针。

c)您可以将指针参数添加到原型中,并传递内部if所需的内容或尝试trick