c++;带地址的数组迭代-堆损坏 我是C++新手,尝试一些东西。 因此,最近我尝试在堆上创建一个int数组,并使用寻址来迭代它,而不是使用[x]的标准方法

c++;带地址的数组迭代-堆损坏 我是C++新手,尝试一些东西。 因此,最近我尝试在堆上创建一个int数组,并使用寻址来迭代它,而不是使用[x]的标准方法,c++,arrays,pointers,iteration,heap,C++,Arrays,Pointers,Iteration,Heap,每次执行代码时,都会出现堆损坏错误。 我尝试了几种方法(也在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 <<

每次执行代码时,都会出现堆损坏错误。 我尝试了几种方法(也在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;
int*p=newint[5];
对于(int i=0;i当你这样做时

p = (p + sizeof(*p));
您在数组中执行
sizeof(int)
int大小的步骤,超出了数组的界限

您需要采取单个步骤:

p = (p + 1);

但请注意,执行此操作后,
p
不再指向您可以调用的任何位置。您需要保留指向原始地址的指针:

int* arr = new int[5];
int* p = arr;

....

delete[] arr;
但是您没有理由首先使用
new
分配数组

int arr[5];
int * p = arr;
....
每次迭代都会导致
4
,因为
sizeof(int)
等于
4
。因此,您将越界

标准方式,即:

p[i] = i;
cout << p[i] << endl;
p[i]=i;
这句话怎么说

p = (p + sizeof(*p)); 
delete[] p;
p = (p + sizeof(*p)); 
这是错误的

首先,您要更改指向已分配内存的指针p的初始值

p = (p + sizeof(*p)); 
delete[] p;
p = (p + sizeof(*p)); 
由于p的初始值已更改,因此此指针将出错

第二个表达式
p+sizeof(*p)
表示要将指针向右移动到sizeof(*p)元素。例如,如果
sizeof(*p)
等于4,则after语句

p = (p + sizeof(*p)); 
delete[] p;
p = (p + sizeof(*p)); 
p将指向数组的第五个元素(即索引为4的元素)

有效的代码可以如下所示

int* p = new int[5];

for ( int i = 0; i < 5; i++){

    *( p + i ) = i;
    cout << *( p + i ) << endl;
}

delete[] p;
int*p=newint[5];
对于(int i=0;i<5;i++){
*(p+i)=i;

cout在指针算术中,表达式
p+i
,其中
p
是指向数组元素的指针,
i
是整数,相当于
和(p[i])
,即指向数组元素
i
位置的指针,位于
p
指向的位置之后

这就是为什么步进到下一个元素由
p=p+1
(或者等价地
p+=1
或者简单地
++p
)执行的原因

但是请注意,增量不会检查数组边界–如果下一项属于同一数组,则可以安全地访问下一项。如果超出数组的最后一项,则可能会出现内存访问错误或只是读取一些垃圾

参见示例


我想我可以用指针p,p=0xSomething01获得第一个数组插槽的地址,然后添加一个整数。然后将整数的大小添加到地址中,我就可以得到下一个地址。所以这根本不起作用?@Jazjef我想我的答案很清楚。指针算法会考虑被放置对象的大小评级超过。
++p
意味着“将
p
的地址增加一个
int
大小的步骤,即使
p
从您自己的代码指向下一个
int
@Jazjef:
谢谢您的解释。看起来我混合了一些指针和地址的想法:)将for循环编写为for(int i=0;i<5;i++)更清晰,因为比较迭代限制5和数组大小更简单。