NULL指针问题

2025-03-04 11:29:21
推荐回答(3个)
回答1:

printf("%s", ptr)
对ptr=NULL(0x00),有空指针保护,即打印(nil),而不会出异常。而对于其它非0值的指针,则没有保护,会出异常。

因此当没有int a时,ptr->str=0x00。所以printf不会异常。当有int a时,ptr->str=0x04,所以会出现异常。

回答2:

要想出现异常,那么 ptr指针必须指向一个不可访问的内存,而这里ptr却指向了一个空内存,NULL就是0,是可以访问的,但是没有任何内容。
如果你把= NULL 去掉,那么ptr是个随即的值,不确定指到什么地方去了,异常可能性很大。

回答3:

可能基于效率考虑(判断指针是否合法应该是程序员的职责),C++被设计为访问空指针不会抛出C++异常(其它语言有可能会,例如Java会有null pointer exception),除非显式抛出:
if(ptr == NULL)
throw null_pointer_exception(); //抛出一个自定义异常对象。
如果非法访问内存,那么C++无法保证接下来程序行为,是否抛出异常由实现和环境决定。
LS的“NULL就是0,是可以访问的,但是没有任何内容。”——显然错误。在WinNT平台上,用空指针进行无保护性访问的最可能后果就是错误0x00000005: access violation(访问违例);在*nix环境下则可以引起segmentation fault(段错误)。access violation是WinNT内核支持的一个SEH(结构化异常)。(题外话,似乎VC++2005开始的编译器中,就是用SEH机制来实现C++异常的。)要捕获SEH或者转化为标准C++异常需要写平台相关的代码,比较复杂,如果有兴趣可以自行Google。
====
[原创回答团]