在C和C++中,这被称为“未定义行为”,这意味着它可能会导致“分段错误”、无输出或者其他一些基于您的编译器、运行此代码的操作系统、环境等因素造成的情况。将函数指针初始化为NULL或将指针初始化为NULL有助于某些开发人员确保其指针未初始化且不等于随机值,从而防止意外解引用。
当您尝试访问NULL时会发生什么? 以下是关于数据和代码的真相,以及当您尝试读取NULL(或0到4096之间的任何地址,即至少段的第一页)时会发生的情况。其根本原因在于操作系统和微处理器的分段/分页架构。 当您尝试访问任何数据或代码的NULL(或0)地址时,它会导致分段错误(实际上是致命的页错误)。部分的第一页被视为虚拟地址空间的无效部分或无效部分。这是故意保持第一页无效(或不存在),以便在程序执行时,指针包含的至少一个地址可以表示为无效。 第一页的页描述符(其中包含虚拟地址0,NULL)的第一位“present”为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 为什么函数指针初始化为NULL? 尽管如果您尝试使用NULL调用函数将导致页面/段错误。NULL表示其为无效函数。如果它包含任何垃圾地址,但在代码部分的有效虚拟地址空间中,则认为将调用该地址上的任何代码,这可能会更加灾难性(特别是在实时系统中)。将funcp = funct_foo_name + 1初始化;现在使用函数指针调用函数。函数指针指向代码部分的有效虚拟地址空间。但函数将从不正确的位置开始执行。这可能导致错误的代码执行或错误的顺序。