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对数组下标不做检查;指针越界访问内存,编译器不会提示错误。利用越界的指针读写内存,轻则程序结果错误,重则直接导致程序崩溃。