C++ 空函数指针
调用空函数指针的行为是什么C++ 空函数指针,c++,c,c99,C++,C,C99,调用空函数指针的行为是什么 void (*pFunc)(void) = NULL; pFunc(); 为什么建议将尚未使用的函数指针初始化为NULL?建议的原因与初始化“正常”(数据)指针为NULL的原因相同:因为这可能会使某些错误更容易跟踪。对这个有用与否的看法当然是不同的:--(p)< c/C++ >,这被称为未定义行为< /代码>,这意味着这会导致分割错误,这种情况不会基于您的编译器、运行该代码的操作系统、环境等而引起。 初始化一个指向函数的指针,或者一个指向NULL的指针,可以帮助
void (*pFunc)(void) = NULL;
pFunc();
为什么建议将尚未使用的函数指针初始化为NULL?建议的原因与初始化“正常”(数据)指针为NULL的原因相同:因为这可能会使某些错误更容易跟踪。对这个有用与否的看法当然是不同的:--(p)< c/C++ >,这被称为<代码>未定义行为< /代码>,这意味着这会导致分割错误,这种情况不会基于您的编译器、运行该代码的操作系统、环境等而引起。 初始化一个指向函数的指针,或者一个指向NULL的指针,可以帮助一些开发人员确保他们的指针未初始化,并且不等于一个随机值,从而防止他们意外地取消对它的引用
就像一个普通指针一样,我想你会得到一个segfault。这两个指针指向同一个问题:-)这将导致99%的情况下以及许多系统/架构上出现分段错误。然而,该标准并没有明确说明它会发生。我认为这是“未指定”的行为,但并非真正未定义。如果内存0x0是可寻址和“可执行的”…@rodrigo:对。我想知道的是,标准是否明确规定不允许将0x0作为有效内存地址。那就是“未定义的行为”。如果它没有这样说,那么它将是未指定的-这本质上是两件不同的事情。@VladLazarenko:标准没有提到地址0x0。关于
NULL
指针,它只说明了两件事:没有有效的函数对象具有addressNULL
;引用/调用NULL
指针是UB。现在,一个实现可以选择记录该特定行为,甚至可以指定NULL
指针的二进制值。有关更好的解释,请参见。@vonbrand:你是对的:literal0
可以用作NULL
指针常量。但这并不意味着空指针位于地址0x0,或者它是一个全零位模式。NULL
指针的实际地址由实现定义。困惑,我知道,但仅此而已。你做了太多不一定成立的假设。我曾在地址0与地址42890没有任何区别的平台上工作过。正如《圣经》教给我们的,“你不应该跟随空指针,因为混乱和疯狂在它的尽头等待着你。”@NikBougalis:你是对的。我所说的第一页或无效地址范围0到4096(这是x386的标准页面大小)是指初始无效的虚拟地址空间。我认为这是一个依赖操作系统的东西,它认为虚拟地址空间范围的初始部分有多少是无效的