C语言指针访问越界

有一个问题不太明白。C语言编译器对指针访问越界不做检查,比如
int a[10],*p=a+9;
p++;p++;
可以正常通过编译。
但是操作系统内存管理模块不是会对各个程序的地址做检查保护么,那么在windows里,对于有类似错误的控制台程序程序还能够运行吗?操作系统一定能检测到错误并提示么?
在unix或linux里呢?
windows的存储管理是虚拟分页管理方式么?还是虚拟分段方式?或者虚拟段页式方式?如果是这些离散的存储管理方式,不是有针对于进程存储保护么?C语言又怎么可以让访存超越本进程的地址空间?

第1个回答  2011-10-05
这个本身就不应该检查啊。因为指针p指向的东西不一定要在数组a的范围内。他可以指向任何存在的地址范围。追问

windows的存储管理是虚拟分页管理方式么?还是虚拟分段方式?或者虚拟段页式方式?如果是这些离散的存储管理方式,不是有针对于进程存储保护么?C语言又怎么可以让访存超越本进程的地址空间?

第2个回答  2011-10-07
有指针越界,如果不是写程序者的本意,那么一般程序都不会正常运行,都要修改掉。追问

windows的存储管理是虚拟分页管理方式么?还是虚拟分段方式?或者虚拟段页式方式?如果是这些离散的存储管理方式,不是有针对于进程存储保护么?C语言又怎么可以让访存超越本进程的地址空间?

第3个回答  2011-10-22
操作系统内存管理模块,起到的作用是保存进程的地址空间,即A进程不能“随便”访问B进程的地址。
而C++语言因为有指针,所以可以让指针在内存中疯狂移动,当然也可以移动到不属于自己进程的内存地址空间上。比如上面再次p++(最好写成++p),指针就有可能跑到其它进程了,而如果此时指针所指的地址正在被使用,就会出现read only之类的错误。但如果运气好,越界的指针所指地址没有被其它进程使用,这时程序就不会报错!!!
这就是为什么指针越界后,运行程序时有时会报错,而有时只有程序逻辑上的错误!!

unix和linux上也大同小异。

问题补充:这是操作系统和硬件打交道的事,不关C语言的事,操作系统已经为C语言做好了访存的工作。本回答被提问者采纳
相似回答