这可能是一个非常基本的问题。 据我所知,有一个C约定以空指针的值设置为零。 有没有可能是你所能分配空间在Windows中一个新的变量,并分配空间的地址恰好是零? 如果不是,通常占该地址区域?
Answer 1:
在MS-DOS的空指针是一个相当有效的指针,并由于在操作系统运行实模式下它实际上可能覆盖垃圾和腐败内核0x0的地址。 你可以这样做:
int i;
unsigned char* ptr = (unsigned char *)0x0;
for(i = 0; i < 1024; i++)
ptr[i] = 0x0;
现代操作系统(如Linux的系统,Windows)运行在保护模式下它永远不会让你到物理内存的直接访问。
该处理器将物理地址映射到虚拟地址 ,你的程序将利用。
它还会跟踪你访问什么,你敢摸的东西不属于你,你就麻烦了(你的程序将段错误 )。 这最肯定包括试图取消引用0x0的地址。
Answer 2:
当你“指针的值设置为零”作为
int *p = 0;
它不一定会最终指向物理地址零,你似乎认为。 当指针被分配一个恒定的值为零 (或与它初始化),编译器需要识别这种情况,并以特殊的方式对待它。 编译器需要与实现相关的空指针值替换为零。 后者并不一定指向零个地址。
空指针值应该通过将不被用于任何其他目的的物理地址来表示。 如果在一些实现物理地址零是一个可用的地址,那么这样的实现将不得不使用不同的物理地址来表示空指针。 例如,一些实现可能使用的地址0xFFFFFFFF
用于这一目的。 在这样的实施初始化
int *p = 0;
实际上将初始化p
与物理0xFFFFFFFF
,而不是物理为零。
PS你可能想看看FAQ: http://c-faq.com/null/index.html ,其中大部分是致力于正是问题。
Answer 3:
值0
没有任何特殊含义。 它是一个指针设置为0的公约和C编译器必须相应解释。 然而,有一个物理地址0而事实上,该地址可以是一个有效的地址没有任何关系。 在许多系统中,虽然下不会忽略由包含硬件相关不会忽略,如中断向量或其他。 在Amiga例如,地址4是入口点到操作系统中,这也是一个任意决定。
Answer 4:
如果分配的空间地址是零,有足够的存储空间。 这意味着您的变量无法分配。
Answer 5:
在0x0的网络地址就是CPU开始执行,当你接通电源。 一般在此地址有一个跳转到BIOS代码和IIRC第一个64K(或多个),用于其它任务被保留(由BIOS / UEFI测定)。 这是未由应用程序accessbile的区域。
考虑到它应该清楚,你不能在Windows中地址0x0的变量。