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

时间:2018-09-03 18:20:42

标签: c++ arrays pointers

我有两节课。 class1class2class2创建一个数组,其元素类型为class1class2的成员指向该数组。我可以使用class 2's getpointer方法访问指针,但是当我尝试使用指针访问数组元素的成员时,会得到意外的结果。

代码如下:

#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]

1 个答案:

答案 0 :(得分:2)

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

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

    e = pt;
}

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

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