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的指针,可以帮助一些开发人员确保他们的指针未初始化,并且不等于一个随机值,从而防止他们意外地取消对它的引用

  • 当你试图访问NULL时发生了什么? 下面是关于数据和代码的真实情况,这就是 在尝试读取NULL(或从0到0的任何地址)时发生 4096,即段的至少第一页)。根本原因在于 操作系统和微处理器分段/分页体系结构

    当您尝试访问任何数据或代码中的空(或0)地址时 部分,它会导致分段错误(这实际上是一个杀手 页面错误)。第节的第一页被视为过期(或无效) 虚拟地址空间的一部分。这是有意的第一页 保持无效(或不存在),因此至少有一个地址指向该指针 在执行时,包含在程序中可能表示为无效 时间

    第一页的页描述符(包含虚拟地址0, NULL),第一位“present”为0(表示其无效页面)。现在如果 您尝试访问空指针(0地址),它将导致引发错误 页面错误,因为页面不存在,操作系统将尝试处理此问题 页面错误。当页面错误处理程序看到它试图访问 第一页,被视为虚拟地址的无效部分 它会扼杀进程。这都是关于用户空间过程的。如果 您试图在系统进程(内核级代码)中访问空指针, 它将使你的操作系统失败,并使系统崩溃

    链接:

    以上是足够的bt,因为我认为你应该阅读这一点

  • 为什么函数指针被初始化为NULL? 尽管如果您尝试使用NULL调用,它将给出页/段错误。NULL表示其函数无效。如果是 包含任何垃圾地址,但位于的有效虚拟地址空间中 代码部分,我想那个地址的任何代码都会被调用 可能是更大的灾难(实时系统的spl)。 初始化funcp=funct\u foo\u name+1;现在使用 函数指针。函数指针指向有效的虚拟地址 代码段的空格。bt功能将从错误的位置启动 执行。这可能导致错误的代码执行或错误的 秩序


  • 就像一个普通指针一样,我想你会得到一个segfault。这两个指针指向同一个问题:-)这将导致99%的情况下以及许多系统/架构上出现分段错误。然而,该标准并没有明确说明它会发生。我认为这是“未指定”的行为,但并非真正未定义。如果内存0x0是可寻址和“可执行的”…@rodrigo:对。我想知道的是,标准是否明确规定不允许将0x0作为有效内存地址。那就是“未定义的行为”。如果它没有这样说,那么它将是未指定的-这本质上是两件不同的事情。@VladLazarenko:标准没有提到地址0x0。关于
    NULL
    指针,它只说明了两件事:没有有效的函数对象具有address
    NULL
    ;引用/调用
    NULL
    指针是UB。现在,一个实现可以选择记录该特定行为,甚至可以指定
    NULL
    指针的二进制值。有关更好的解释,请参见。@vonbrand:你是对的:literal
    0
    可以用作
    NULL
    指针常量。但这并不意味着空指针位于地址0x0,或者它是一个全零位模式。
    NULL
    指针的实际地址由实现定义。困惑,我知道,但仅此而已。你做了太多不一定成立的假设。我曾在地址0与地址42890没有任何区别的平台上工作过。正如《圣经》教给我们的,“你不应该跟随空指针,因为混乱和疯狂在它的尽头等待着你。”@NikBougalis:你是对的。我所说的第一页或无效地址范围0到4096(这是x386的标准页面大小)是指初始无效的虚拟地址空间。我认为这是一个依赖操作系统的东西,它认为虚拟地址空间范围的初始部分有多少是无效的