2015-08-09 114 views
0

我试图运行添加了-g标志编译一个老司机MUD和删除-O2标志,这样我就可以对其进行调试。我有一个原型void try_to_swap(void)的功能,但定义为void try_to_swap(volatile int* interrupted)。在函数内部该指针的值被检查:调用函数不带参数时,定义包括参数

if(*interrupted) 
    ... 

功能称为不带参数,比如原型 - try_to_swap();

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

我的问题是:

一)为什么不我做过程中得到任何错误?编译器应该注意到调用中缺少参数吗?

b)在优化,并编译某种程度上照顾指针的值,这样的程序会不会崩溃?

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

+5

当函数试图使用你不及格,那么你有*未定义行为*的参数。不要这样做! –

+3

如果你必须调用没有参数的函数,然后使*两个*函数,一个参数,另一个不接受参数,并用一些默认参数调用其他函数。 –

+0

为什么它被认为没有参数被称为是我的一个谜。也许在以前的版本中,使用volatile int来确定某种中断信号。但函数声明为'void'作为参数。那么为什么连接器在定义与原型不匹配时都会抱怨? – Bart

回答

1

一)在C,()表示“任何参数”,并且是不一样(无效)这是没有参数。 try_to_swap()是有效的,但对用户来说不是一个好的文档。

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

c)您可以将指针参数添加到原型,并通过内部需要的if或尝试trick