Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指针有效地址为空?_C - Fatal编程技术网

C 指针有效地址为空?

C 指针有效地址为空?,c,C,我们可以分配或比较有效指针与0吗?我们在哪里可以将NULL指定为合法? 看看我所知道的NULL是一个无效的指针,指向堆内存,哪个指针还没有释放。但是指针的地址是有效的吗?否,NULL并不以任何方式表示有效的地址NULL是一个宏,基本上是一个实现定义的NULL指针常量 相关,C11,第7.19章 NULL 它扩展为实现定义的空指针常量 它将与任何有效指针进行不相等比较,任何试图解除对使用NULL初始化的指针的引用的尝试都将导致UB 引用第§6.3.2.3章中的C11 如果将空指针常量转换为 指针类

我们可以分配或比较有效指针与0吗?我们在哪里可以将NULL指定为合法?
看看我所知道的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*
,结果是空指针。