我试图运行一个用添加的-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中是否合法,默认值不是一个选项?
答案 0 :(得分:1)
a)在C中,()表示"任何参数"并且与(void)相同,这不是参数。 try_to_swap()
有效,但不是用户的好文档。
b)是的,编译器似乎检测到缺少的参数,只是传递一个空指针。
c)您可以将指针参数添加到原型中,并传递内部if
所需的内容或尝试trick。