C语言指针越界访问示例


C语言对数组下标不做检查,指针常常越界访问;我们编程时要特别注意。

一、示范代码

#include<iostream.h>
#include<memory.h>
int a[10];
int b[10];
void main()
{
memset(a,0,sizeof(int)*10);
memset(b,0,sizeof(int)*10);
a[10]=10;
cout<<b[0]<<endl;
}

在上例中,编译链接通过,但程序运行结果 b[0]=10;

输出a[10]和b[0]地址:

#include <iostream.h>
#include<memory.h>
int a[10];
int b[10];
void main()
{
cout<<hex<<(unsigned int)&a[10]<<endl;
cout<<hex<<(unsigned int)&b[0]<<endl;
}

结果:

a[10] 地址为 0x41454c

b[0]地址为    0x41454c

备注:上述程序在vc6.0下编译,不同编译系统地址值可能不同;但a[10]和b[0]地址值始终相同。

二、解释

连续定义的全局变量在内存中是连续存放的,同时C对数组下标不做检查;指针越界访问内存,编译器不会提示错误。利用越界的指针读写内存,轻则程序结果错误,重则直接导致程序崩溃。

相关内容