NULL作为指针有效地址?

时间:2016-04-18 12:32:22

标签: c

我们可以将有效指针指定或比较为0吗?我们在哪里可以将NULL指定为合法? 看看我知道NULL是一个无效指针,指向堆内存,哪个指针还没有释放。但指针的地址是否有效?

4 个答案:

答案 0 :(得分:3)

  

NULL作为指针有效地址?

可能:NULL是一个扩展为空指针常量的宏。 可能具有类似int 0的值。在这种情况下,它不是指针而是int可能的值为((void*)0),其中指针。当空指针常量转换为void *时,它是空指针没有对象的地址等于空指针 。可以将空指针分配给任何指针变量。

  

我们可以将有效指针指定或比较为0吗?

是。 any_type *ptr = 0;有效。比较if (ptr == 0)有效。作为赋值/比较的一部分,int 0将转换为空指针

  

我们可以将NULL指定为合法吗?

any_type *ptr = NULL;是一项法律任务。

  

看看我所知道的NULL是一个无效指针,指向堆内存,指针尚未释放。但是指针的地址是否有效?

地址有效或无效是无关紧要的。指向堆内存与否是无关紧要的。在C中,将空指针分配给指针变量 有效。将空指针与有效对象进行比较是有效的比较,结果永远不会匹配。

取消引用具有空指针值的指针是未定义的行为(UB)。 可能"工作",可能使代码崩溃。这是UB。

答案 1 :(得分:1)

不,NULL不以任何方式表示有效地址。 C11是一个MACRO,它基本上是一个实现定义的空指针常量

相关,NULL,第7.19章,

  

NULL

  它扩展为实现定义的空指针常量

它将比较不等于任何有效指针,并且任何尝试使用C11初始化指针的尝试都将导致UB。

引用<input type="hidden" name="referrer" value="<?= htmlspecialchars($_SERVER['HTTP_REFERER']) ?>"> ,章节§6.3.2.3

  

如果将空指针常量转换为a   指针类型,结果指针,称为空指针,保证比较不等   指向任何对象或函数的指针。

答案 2 :(得分:1)

NULL是空指针常量,它的值是实现定义的,也就是说,它不一定是0。

根据C11标准,

  

将空指针转换为另一种指针类型会产生该类型的空指针。任何两个空指针都应该相等。

此外,为指针分配整数是实现定义的,如果你想制作可移植的代码,你不应该依赖它。

  

整数可以转换为任何指针类型。除非先前指定,否则结果是实现定义的,可能未正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示。

答案 3 :(得分:0)

根据定义,

NULL是无效指针。但。在大多数系统上,指针只是我们提供特殊处理的数字。在不久之前(可能是十年左右),在某些操作系统上可能会强行将内存映射到NULL指针指向的地址。

这导致了一种危险的情况,即操作系统内核可能有一个相对无害的bug,导致NULL取消引用,通常只是崩溃。但相反,如果恶意程序强行将内存映射到NULL地址然后触发内核NULL取消引用,它将指向有效内存,如果正确完成,它可能会将简单的系统崩溃升级为内核级别权限提升。

Linux中存在一个错误,其中驱动程序可能被愚弄执行NULL函数指针,并允许恶意程序将代码放在内核将以提升的权限执行的地址。

从那时起,大多数操作系统都加强了安全性,并禁止在地址处和接近NULL的地方映射任何有效内存(&#34;接近&#34;以防止通过NULL指针进行大偏移的阵列访问)