c++;带地址的数组迭代-堆损坏 我是C++新手,尝试一些东西。 因此,最近我尝试在堆上创建一个int数组,并使用寻址来迭代它,而不是使用[x]的标准方法
每次执行代码时,都会出现堆损坏错误。 我尝试了几种方法(也在stackoverflow上搜索过),但没有找到任何答案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 <<
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和数组大小更简单。