我试图运行添加了-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中甚至是合法的,默认值不是一个选项?
当函数试图使用你不及格,那么你有*未定义行为*的参数。不要这样做! –
如果你必须调用没有参数的函数,然后使*两个*函数,一个参数,另一个不接受参数,并用一些默认参数调用其他函数。 –
为什么它被认为没有参数被称为是我的一个谜。也许在以前的版本中,使用volatile int来确定某种中断信号。但函数声明为'void'作为参数。那么为什么连接器在定义与原型不匹配时都会抱怨? – Bart