我们可以将有效指针指定或比较为0吗?我们在哪里可以将NULL指定为合法? 看看我知道NULL是一个无效指针,指向堆内存,哪个指针还没有释放。但指针的地址是否有效?
答案 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指针进行大偏移的阵列访问)