当前位置:C++技术网 > 资讯 > 为什么无效指针经常是NULL(0)

为什么无效指针经常是NULL(0)

更新时间:2015-06-25 21:23:25浏览次数:1+次

    在本文中,我不打算深入讲解Windows操作系统的内存管理的知识,这是很复杂的问题。现在我还在研究,还没有研究透,等什么时候研究透了,我再深入浅出给大家讲解。只能告诉大家,现在我还在内存的迷雾中探索,等我出来了,大家也就可以快速的清除故障。我会将我初学以及现在的各种疑问,以自学者的角度分析清楚,让你一开始就很清晰的了解,而不会迷迷糊糊的。看了一遍又一遍却始终不清楚怎么回事。大师总有选择,深入的就忽略了基础的背景等,很多人直接学习系统核心根本就摸不着头脑,那根本就不是给初学者看的。然而我却会给大家,简化模型,我学到哪大家也就可以学到哪。我把我视为为初学者扫清故障的“先驱者”,让大家都可以很轻松的跟进,希望大家可以学的更深,而不是被各种故障阻挡在门外!!希望有更多的人,深入浅出一方面让更多初学者能够轻松踏入高手行列并肩作战!!下面回归正题。
    这里就大概说一下内存体系。
    Windows的程序所涉及的内存都是虚拟内存,而不是实际的物理内存。这一点是最基本要了解的。第二点,每个进程都有一个独立的虚拟地址空间,如果是32位的系统,那么虚拟地址空间就是4GB,对于你的进程来讲,虚拟内存就是4GB的。这个就稍微了解一下,深入清晰的了解我还要深入研究。
    然后在进程的虚拟地址空间(虚拟内存)中,有一个内存分布。并不是虚拟内存中所有的地址都是进程可以用的。粗略的来分,可以分为最低地址的一小块,从0开始到一个地址的范围。然后就是进程的虚拟内存可用范围(用户模式分区),然后就是一个64KB的禁入分区。其他的基本就是操作系统的内核模式分区。
    因为不同的内存模式,不同的系统位数都会让这个分区的范围不一样,所以这里只是给大家一个概念,这里不必深究。从0开始的一段,范围是0x0000到0xffff。这个范围的虚拟地址,是空指针赋值分区,那么只要你的指针的值是落在这个分区的地址的,都属于无效指针。只要访问,就会触发内存访问违规。这个做法是操作系统方便检测无效指针的。虽然有这个一个范围,但是0这个值是最方便记忆和使用的,只要指针值为0(宏为NULL),那么就是无效指针,不能对此指针进行数据操作。
    这里附带说一下,64KB禁入分区是在用户分区和内核分区之间的一段虚拟内存分区,主要用来防止进程用户空间溢出破坏系统内核的内存,做一个隔离的作用,防止内存溢出攻击。这里就大致了解一下,就可以了。
    所以,在平常使用指针时,如果指针没有指向,或者指针指向的内存释放了,请立即将指针置空,这样可以便于查找到指针使用错误。这个错误如果不注意,在后期找错时是非常难以发现的。很多程序BUG都是指针使用的问题。这也是大家最为头痛的问题。现在了解了,请养成一个好的编程习惯,从根本上根除隐患!!