原始计算机基本上只有物理地址从 0 开始的内存,对吗?然后有人可以编写汇编代码(例如 BIOS)并将值实际设置为 0。
现在,如果有启动计算机的 BIOS,那么有人可以为操作系统编写加载程序。那个人可以决定用汇编语言将实际值移动到内存中的位置 0 吗?
如果他们使用 C 或 C++ 呢?他们可以有一个值为 0 的指针并使用它来访问第一个内存位置吗?这是否需要经过特殊调整的编译器?
然后操作系统进入现场。它有一个由 malloc
调用的内存管理器。以获得更多内存。是否可以编写一个操作系统,它可以简单地将空指针用作普通指针,但在其他方面的行为与 Linux 完全一样,然后如果有人使用普通的、未修改的 GCC 编译 C 程序,空指针就不会导致分段过错?
最佳答案
而 NULL 指针在 C 源代码中表示为 0
,并不要求底层位模式实际上必须为 0。它只需要与非 NULL 指针区分开即可。有一些架构的例子在幕后不是零。
C 实现本身决定了 NULL 是什么。
您还应该意识到现代操作系统(好吧,那些使用虚拟内存的操作系统)在进程虚拟地址空间和底层物理内存之间存在脱节。
关于pointers - 空指针定义在计算机的哪一层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5283113/