繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM