C语言指针越界访问示例

来源:互联网 发布:2015年好听的网络歌曲 编辑:程序博客网 时间:2024/05/14 13:45

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