NULL函数指针

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

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

为什么将未使用的函数指针初始化为NULL是可取的?

在C和C ++中,这称为undefined behaviour ,这意味着这可能导致分段错误 ,根据您的编译器,运行此代码的操作系统,环境(等等),此类情况不会引起任何情况。 ..)意思是。

初始化指向函数的指针或通常指向NULL的指针有助于某些开发人员确保其指针未初始化且不等于随机值,从而防止它们意外地解除引用它。

  1. 当你尝试访问NULL时会有什么好处? 以下是关于数据和代码的情况,这是当您尝试读取NULL(或从0到4096的任何地址,即至少段的第一页)时发生的情况。 其根本原因在于OS和微处理器分段/分页架构

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

    第1页的页面描述符(包含虚拟地址0,NULL),第一位“存在”为0(表示其无效页面)。 现在,如果您尝试访问NULL指针(0地址),它将导致在页面不存在时引发页面错误,并且OS将尝试处理此页面错误。 当页面error handling程序看到它试图访问第一页时,它被视为虚拟地址空间的无效部分,它会终止进程。 这完全是关于用户空间过程。 如果您尝试在系统进程(内核级代码)中访问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表示其无效function。 如果它包含任何垃圾地址但是在代码段的有效虚拟地址空间中,我认为将调用该地址的任何代码,这可能更加灾难(在实时系统的情况下为spl)。 初始化funcp = funct_foo_name + 1; 现在使用函数指针调用函数。 函数指针指向代码段的有效虚拟地址空间。 bt函数将从不正确的位置开始执行。 这可能导致错误的代码执行或错误的顺序。

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