为什么内存地址0x0保留,并为什么?我无法理解什么,谢谢你的帮助为什么内存地址0x0保留,并为什么?
回答
它主要是约定,它是具体实现。
C语言标准(C99或C11) - 和一些其他的编程语言如Lisp-具有null pointer不能被解除引用的概念(这将是undefined behavior,segmentation fault),并且是任何其它指针的不同(某些有效的内存位置)。 Tony Hoare谦虚地称这种概念为"my billion dollar mistake",而某些语言(Haskell,Ocaml)具有一些3210类型(例如Ocaml中的'a option
)。
大多数的实现(但不是全部)通过地址0
表示空指针在实践中,在桌面,膝上型计算机或平板计算机,用户模式C程序中一些virtual address space运行,其中含有该地址的页0未映射。 (在一些Linux,你或许可以用mmap(2)的MAP_FIXED
地址为0,但是这将是口感差...)
在一些嵌入式microcontrollers(例如AVR),地址0可以使用。
在理论(和过去),地址可能是多了一些更复杂的......(在上世纪80年代,如x86 memory segmentation上i286,并且iAPX432寻址,Rekursiv建筑等...)
读几本书和C编程网页,微处理器架构& instruction sets,operating system原则,virtual memory,MMU秒。
它一直在分页内存系统中的常见做法,是不会默认的第(零)页面映射。这是链接器强制执行的约定。当程序加载器读取可执行文件时,它永远不会获得映射第一个逻辑页面的指令。
原因是检测空指针错误。
int *whatever = 0 ;
. . . .
*whatever = 10 ;
将导致访问冲突。
这就是说,它通常是可能的过程映射执行开始后的第一个(零)页面,并在某些情况下,你可以指定链接器选项,允许程序段必须有依据。
- 1. 为什么get_memory_usage保留内存?
- 2. self.viewDelegate = 0x0为什么?
- 3. 为什么UILabel 0x0?
- 4. CALayer为什么不保留其内容?
- 5. 为什么Azure保留子网的前四个IP地址
- 6. 为什么GDB中的一些内存地址比其他内存地址短?
- 7. 什么导致内存保留
- 8. 为什么.NET为我的应用程序保留这么多内存?
- 9. 保留的内存地址?
- 10. 为什么Android的JSONObject保留在内存中?
- 11. 为什么Backbone.View对象仍然保留在内存中?
- 12. 为什么插入空结构保留向量增加内存?
- 13. 这个内存地址包含什么?
- 14. 为什么这么多“保留的内置符号”-s在python
- 15. 为什么不保存cookie?
- 16. 为什么我无法保留通过谷歌地图的返回地址
- 17. 为什么我的程序输出内存地址?
- 18. 为什么Rails在我的页面上显示内存地址?
- 19. MIPS为什么内存地址增加4?
- 20. 为什么数组的内存地址总是增加?
- 21. 为什么在运行时改变内存地址
- 22. 为什么每次编译时内存地址都会改变?
- 23. 为什么这些调用具有相同的内存地址?
- 24. 为什么内存地址以0x开头?
- 25. vb6为什么我想要无人执行并保留在内存集中?
- 26. 为什么0x0指向有效数据
- 27. 什么为0x0指示指令
- 28. 为什么addSubview不保留视图
- 29. NSTimer保留数增加,为什么?
- 30. 为什么GCC保留空功能?