奇了怪了,难道指针指向的数组就可以越界吗?
今天无意和朋友讨论:
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;
因为你申请的是一维的空间
#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];
[解决办法]