首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

奇了怪了,莫非指针指向的数组就可以越界吗

2012-10-09 
奇了怪了,难道指针指向的数组就可以越界吗?今天无意和朋友讨论:BYTE bnew BYTE[10];那么写b[10]0x01b[1

奇了怪了,难道指针指向的数组就可以越界吗?
今天无意和朋友讨论:
BYTE b=new BYTE[10];
那么写
b[10]=0x01;
b[11]=0x12; ....
程序会不会报错呢?虽然开的数组是10个,但是指针指的是地址啊,地址往下移就行啊。
大家纷纷说必报错,但是在VS6,VS2008中试验,却都是可以正常运行的。大家不信也可以试试。
求问为什么?我总觉的有什么不对,想问一下,在什么情况下会出错呢。



唯一出错的就是在释放内存时出错了。
delete[] b; //红叉子了。

[解决办法]
如果没其他对象用到b[10],b[11]就不会出错,如果用到就踩内存了。
[解决办法]
没出错是侥幸.使用上是不对的。属于越界访问
[解决办法]
先说上面那个
因为c语言为了保证效率,是不严格检查越界的,当然出错了只能自己扛着
也就是说你自己心里要有数,下标越界是不会报错的

delete[] b; 
有new就要有delete
也就是说在new的时候,编译器已经记住了你申请的堆内存的规模
当你delete的时候,你就要成对的delete b;
因为你申请的是一维的空间

C/C++ code
#include <iostream>using std::cout;using std::endl;void main(){    int **p = new int*[10];    for(int i=0; i<10; i++)    {        p[i] = new int[10];     }    for(i=0; i<10; i++)    {        for(int j=0; j<10; j++)        {         p[i][j]=0;         cout<< p[i][j] <<' ';         }         cout << endl;     }     // 先释放一维指针指向的内存空间     for(i=0; i<10; i++)    {         delete[] p[i];     }     delete p;}
[解决办法]
语法错误,但编译器检查不出,理论上会报错
实际根据内存分配算法而定,一般分配时会进行字节对齐,前后预留一些内存空间(存放标志位数据等),
返回的是中间部分内存,所以有时越界了,也不会造成程序崩掉

delete[]出错,也就是说把标志位数据给覆盖了

另外纠正一下
BYTE *b=new BYTE[10];
[解决办法]
探讨
没出错是侥幸.使用上是不对的。属于越界访问

[解决办法]
这确实是错的,虽然有时候编译器报不出来。
[解决办法]
这不是很正常的现象吗
[解决办法]
delete不就报错了吗

热点排行