13

调用空函数指针的行为是什么?

void (*pFunc)(void) = NULL;  
pFunc();

为什么建议将尚未使用的函数指针初始化为 NULL?

4

3 回答 3

13

在 C 和 C++ 中,这被称为undefined behaviour,这意味着这可能会导致分段错误,根据您的编译器、运行此代码的操作系统、环境(等等... ) 方法。

初始化指向函数的指针,或一般指向 NULL 的指针有助于一些开发人员确保他们的指针未初始化且不等于随机值,从而防止他们意外取消引用它。

于 2013-02-26T13:13:38.957 回答
2
  1. 当您尝试访问 NULL 时会发生什么?以下关于数据和代码都是正确的,这就是当您尝试读取 NULL(或从 0 到 4096 的任何地址,即至少段的第一页)时发生的情况。其根本原因在于操作系统和微处理器分段/分页架构

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

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

    链接: http: //en.wikipedia.org/wiki/Page_fault#Invalid http://en.wikipedia.org/wiki/Memory_protection#Paged_virtual_memory http://pdos.csail.mit.edu/6.828/2005/readings/ i386/s05_02.htm

    以上就足够了,因为我认为您也应该阅读此内容 http://www.iecc.com/linker/linker04.txt

  2. 为什么函数指针初始化为NULL?尽管如果您尝试使用 NULL 调用它,则会出现页面/段错误。NULL 表示它的无效功能。如果它包含任何垃圾地址但在代码段的有效虚拟地址空间中,我认为该地址处的任何代码都将被调用,这可能是更大的灾难(在实时系统的情况下为 spl)。初始化 funcp = funct_foo_name + 1; 现在使用函数指针调用函数。函数指针指向代码段的有效虚拟地址空间。bt 函数将从错误的位置开始执行。这可能导致错误的代码执行或错误的顺序。

于 2013-02-26T14:42:40.853 回答
0

出于与初始化“正常”(数据)指针相同的原因,建议这样做NULL:因为它可能会使一些错误更容易追踪。关于这是否有用的意见当然会有所不同:-)

于 2013-02-26T13:11:01.223 回答