[英]Calling function without parameters when the definition includes parameters
我正在尝试运行带有添加的-g
标志和删除的-O2
标志的旧MUD驱动程序,以便可以对其进行调试。 我有一个原型为void try_to_swap(void)
的函数,但定义为void try_to_swap(volatile int* interrupted)
。 在函数内部检查该指针的值:
if(*interrupted)
...
该函数无需参数即可调用,例如原型try_to_swap();
使用优化标志,一切正常。 但是如果没有它,则在调用该函数时会得到SIGSEGV
。 问题是指针指向该进程不可访问的地址(每次为0x3b
),因此出现分段错误。
我的问题是:
a)为什么在制作过程中没有出现任何错误? 编译器是否应该以某种方式注意到调用中缺少参数的情况?
b)在优化过程中,编译器是否以某种方式照顾了指针的值,因此程序不会崩溃?
c)解决这个问题的正确方法是什么? 从定义中删除指针,将其添加到原型中? 指针仅在此函数中使用,并且仅在if
中提及。 它似乎没有在任何地方初始化。 还是以某种方式自动初始化? 我对volatile
指针不太熟悉。 但是指针值是函数调用之前来自堆栈集的随机垃圾,因为没有提供参数值。 这在C中是合法的,因为C中没有默认值?
a)在C中, ()表示“任何参数”,并且与没有参数的(void)不同 。 try_to_swap()
有效,但对用户而言不是一个很好的文档。
b)是,编译器似乎检测到缺少的参数,只是传递了一个空指针。
c)您可以将指针参数添加到原型,并传递内部if
或try 技巧所需的内容 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.