带地址的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

链接地址: http://www.djcxy.com/p/82333.html

上一篇: c++ array iteration with addresses

下一篇: C++ delete crashes on certain instances