使用指针访问数组元素时出现意外结果

Unexpected Results When Using Pointers to Access Array Elements

本文关键字:意外 结果 数组元素 指针 访问      更新时间:2023-10-16

我有两个类。class1class2.class2创建一个包含类型为class1的元素的数组。class2有一个指向该数组的成员。 我可以使用class 2'sgetpointer方法访问指针,但是当我尝试使用指针访问数组元素的成员时,我得到了意外的结果。

代码如下:

#include <iostream>
using namespace std;
class class1{
int a;
int b;
public:
class1(){}
class1(int x, int y){a = x; b = y;}
int geta(){return a;}
int getb(){return b;}
};
class class2{
int c;
int d;
class1 *e;
public:
class2(int x, int y){c = x; d = y;}
void setE(){
class1 arr[3];
class1 arrTemp (0,0);
arr[0] = arrTemp;
class1 arrTemp1 (1,1);
arr[1] = arrTemp1;
class1 arrTemp2 (2,2);
arr[2] = arrTemp2;

cout << "Element 1, A = ";
cout << arr[0].geta() << endl;
cout << "Element 1, B = ";
cout << arr[0].getb() << endl;
cout << "Element 2, A = ";
cout << arr[1].geta() << endl;
cout << "Element 2, B = ";
cout << arr[1].getb() << endl;     

cout << "Element 3, A = ";
cout << arr[2].geta() << endl;
cout << "Element 3, B = ";
cout << arr[2].getb() << endl;        
class1 *pt;
pt = &arr[0];
e = pt;
}
class1* getpointer(){return e;}
};
int main(){
class2 testObj (1,2);
testObj.setE();
class1 *objPointer = testObj.getpointer(); 
class1 tempclass1;
tempclass1 = *(objPointer + 0);
cout << "Element 1, A = ";
cout << tempclass1.geta() << endl;
cout << "Element 1, B = ";
cout << tempclass1.getb() << endl;
tempclass1 = *(objPointer + 1);
cout << "Element 2, A = ";
cout << tempclass1.geta() << endl;
cout << "Element 2, B = ";
cout << tempclass1.getb() << endl;  
tempclass1 = *(objPointer + 1);
cout << "Element 3, A = ";
cout << tempclass1.geta() << endl;
cout << "Element 3, B = ";
cout << tempclass1.getb() << endl;             

};

这是输出:

Element 1, A = 0
Element 1, B = 0
Element 2, A = 1
Element 2, B = 1
Element 3, A = 2
Element 3, B = 2
Element 1, A = 0
Element 1, B = 0
Element 2, A = -360531408
Element 2, B = 29391
Element 3, A = -360531408
Element 3, B = 29391

使用第一组cout语句,我验证数据是否正确进入数组。

看起来我得到了第一个元素的正确数据,但之后我用指针得到的数据与实际数组完全不同。 我对C++很陌生,但我认为*(Pointer + i)等于arr[i].

在您的示例中,至少有一个问题位于此处:

void setE(){
class1 arr[3];
...
class1 *pt;
pt = &arr[0];
e = pt;
}

arr[3]是一个本地对象,当方法结束时被销毁。您仍然使类成员e指向此对象。

当该方法结束时arr内存被释放,并且可以被其他对象自由覆盖。因此,当使用e读取内存时,您会观察到意外的值。