C 指针有效地址为空?
我们可以分配或比较有效指针与0吗?我们在哪里可以将NULL指定为合法?C 指针有效地址为空?,c,C,我们可以分配或比较有效指针与0吗?我们在哪里可以将NULL指定为合法? 看看我所知道的NULL是一个无效的指针,指向堆内存,哪个指针还没有释放。但是指针的地址是有效的吗?否,NULL并不以任何方式表示有效的地址NULL是一个宏,基本上是一个实现定义的NULL指针常量 相关,C11,第7.19章 NULL 它扩展为实现定义的空指针常量 它将与任何有效指针进行不相等比较,任何试图解除对使用NULL初始化的指针的引用的尝试都将导致UB 引用第§6.3.2.3章中的C11 如果将空指针常量转换为 指针类
看看我所知道的NULL是一个无效的指针,指向堆内存,哪个指针还没有释放。但是指针的地址是有效的吗?否,
NULL
并不以任何方式表示有效的地址NULL
是一个宏,基本上是一个实现定义的NULL指针常量
相关,C11
,第7.19章
NULL
它扩展为实现定义的空指针常量 它将与任何有效指针进行不相等比较,任何试图解除对使用
NULL
初始化的指针的引用的尝试都将导致UB
引用第§6.3.2.3章中的C11
如果将空指针常量转换为
指针类型,结果指针称为空指针,保证比较不相等
指向任何对象或函数的指针
NULL
是空指针常量,其值由实现定义,也就是说,它不一定是0
根据C11标准
将空指针转换为另一种指针类型将生成该类型的空指针。任何两个空指针的比较应相等
此外,将整数分配给指针是实现定义的,若要生成可移植代码,不应依赖于它
整数可以转换为任何指针类型。除非前面指定,否则结果是实现定义的,可能没有正确对齐,可能没有指向引用类型的实体,并且可能是陷阱表示
根据定义,
NULL
是无效指针。但是在大多数系统中,指针只是我们给予特殊处理的数字。直到不久前(也许十年左右),在某些操作系统上,还可以强制将内存映射到空指针指向的地址
这导致了一种危险的情况,操作系统内核可能有一个相对无害的错误,导致空引用,通常只是崩溃。但是,如果恶意程序强制将内存映射到空地址,然后触发内核空解引用,它将指向有效内存,如果操作正确,可能会将简单的系统崩溃升级为内核级权限升级
Linux中存在一个bug,驱动程序可能会被愚弄执行空函数指针,从而允许恶意程序将代码放在内核将以提升权限执行的地址
从那时起,大多数操作系统都加强了安全性,不允许将任何有效内存映射到位于和接近NULL的地址(“close-to”以防止通过NULL指针进行大偏移量的数组访问)
指针有效地址为空
可能:NULL
是一个扩展为空指针常量的宏。它的值可能类似于int
0。在这种情况下,它不是指针而是int
。它可能有一个类似于((void*)0)
的值,这是一个指针。将空指针常量转换为void*
时,它是空指针没有对象的地址等于空指针。空指针可以分配给任何指针变量
我们可以分配或比较有效指针与0吗
对<代码>任意_类型*ptr=0代码>是有效的。如果(ptr==0)比较是有效的。作为赋值/比较的一部分,int
0被转换为空指针
我们在哪里可以将NULL指定为合法
any_type*ptr=NULL代码>是一项合法转让
看看我所知道的NULL是一个无效指针,指向堆内存,这个指针还没有释放。但是指针的地址是否有效
地址是否有效与否无关。是否指向堆内存无关紧要。在C语言中,将空指针赋给指针变量是有效的。将空指针与有效对象进行比较是有效的比较,结果永远不匹配
取消引用具有空指针值的指针是未定义行为(UB)。它可能会“工作”,可能会使代码崩溃。这是UB。一次有太多问题。地址0
和空指针是标准的不同值。而0
和宏NULL
也是不同的东西。将整数强制转换为指针和空指针的位模式由实现定义。null
是宏名称。您几乎无法取消对它的引用…问题出现在典型的系统上,这些系统使用零位模式来表示拉指针,并且具有有效地址0
比较将成功,因此严格违反了标准。“拉指针”是一种很好的类型/o…;-)@Olaf@alk::)嘿,我的键盘上只有几个键在n
和p
之间。但更现代的实际上是冲刺指针;-)0
或任何产生0
的整数常量表达式都是一个特殊的东西。麻烦和困惑的永久原因。是的,对,我同意。详细信息:NULL
不一定是指针。根据C定义,它是“NULL
,扩展为实现定义的空指针常量”;当转换为指针类型时,void*
,结果是空指针。