为什么保留内存地址0x0,为什么?我无法理解究竟是什么,谢谢你的帮助
答案 0 :(得分:3)
它主要是约定,它是特定于实现的。
C语言标准(C99或C11) - 以及其他一些编程语言(如Lisp-)的概念null pointer无法解除引用(undefined behavior,segmentation fault并且与任何其他指针(对于某个有效的存储器位置)不同。 Tony Hoare谦虚地称之为概念"my billion dollar mistake",而一些语言(Haskell,Ocaml)则有一些tagged unions类型(例如Ocaml中的'a option
)。
大多数实现(但不是全部)通过地址0表示空指针。
实际上,在台式机,笔记本电脑或平板电脑上,用户模式C程序在某些virtual address space中运行,其中未映射包含地址0的页面。 (在某些Linux上,您可能会mmap(2) MAP_FIXED
地址为0,但这样会很糟糕......)
在某些嵌入式microcontrollers(例如AVR)中,可以使用地址0。
理论上(以及过去),地址可能比数字更复杂......(在20世纪80年代,例如x86 memory segmentation i286和iAPX432地址,{ {3}}架构等......)
阅读C编程,微处理器架构和数据库的几本书籍和网页。 Rekursiv,instruction sets原则,operating system,virtual memory s。
答案 1 :(得分:2)
分页内存系统的一种常见做法是默认情况下不映射第一个(第0个)页面。这是通常由链接器强制执行的约定。当程序加载器读取可执行文件时,它永远不会获得映射第一个逻辑页面的指令。
原因是检测空指针错误。
int *whatever = 0 ;
. . . .
*whatever = 10 ;
会导致访问冲突。
也就是说,进程通常可以在执行开始后映射第一个(第0个)页面,在某些情况下,您可以指定链接器选项,允许程序部分基于那里。