带地址的c ++数组迭代
我是新来的C + +尝试一些东西。 所以最近我试图在堆上创建一个int数组,然后用地址化代替标准的[x]方法迭代它。
每次执行我的代码时,我都会收到一个堆损坏错误。 我尝试了几件事(也在这里搜索stackoverflow)但找不到任何答案。
int* p = new int[5];
for (int i = 0; i <= 4; i++){
/*p[i] = i;
cout << p[i] << endl;*/ //This is the standard way and works
*p = i;
cout << *p << endl;
p = (p + sizeof(*p)); //iterate the pointer through the heap addresses
}
delete[] p;
应用程序运行并向我显示填充的数组值{0,1,2,3,4},但然后崩溃。
我收到以下错误消息:
检测到堆损坏:在CRT块(#225)后0x00C31B68。 CRT检测到应用程序在堆缓冲区结束后写入内存...
提前致谢
在指针运算中,一个表达式p + i
,其中p
是一个指向数组元素的指针, i
是整数, 相当于 &(p[i])
,它是指向数组元素i
的指针, p
。
这就是为什么通过p = p+1
(或等价的p += 1
或简单的++p
)执行到下一个元素的原因。
但请注意,增量不检查数组边界 - 只要它们属于同一个数组,就可以安全地访问下一个项目。 如果您超出数组的最后一项,则可能会出现内存访问错误或只是读取一些垃圾。
看例如
http://www.tutorialspoint.com/cplusplus/cpp_pointer_arithmatic.htm
https://www.eskimo.com/~scs/cclass/notes/sx10b.html
当你这样做
p = (p + sizeof(*p));
你在整个数组中进行sizeof(int)
int大小的步骤,超越了它的范围。
你需要采取单一步骤:
p = (p + 1);
要么
++p;
但请注意,在做完这些之后, p
不再指向任何可以调用delete[]
地方。 你需要保留一个指向原始地址的指针:
int* arr = new int[5];
int* p = arr;
....
delete[] arr;
但你没有理由首先分配new
的阵列。
int arr[5];
int * p = arr;
....
p = (p + sizeof(*p));
因为sizeof(int)
等于4
,所以每次迭代都会导致跳转4
。 因此,你正在走出界限。
标准的方式,那就是:
p[i] = i;
cout << p[i] << endl;
是正确的,因为i
在每次迭代中增加1
。