数组结构

时间:2011-10-24 02:26:41

标签: c++ pointers

我正在尝试制作一个小的自定义矢量...

元素类,应指向下一个类的地址,但使用此代码

class foo {
private:
    int attr;
public:
    foo(){attr = 10;}
    int get_attr(){return attr;}
    void set_attr(int a){attr =a;}
};

class element_foo {
private:
    foo data;
    element_foo *ptr_next;
public:
    element_foo(){ptr_next = NULL;}
    element_foo(int dat){data.set_attr(dat); ptr_next = NULL;}
    element_foo(int dat, element_foo next){
        data.set_attr(dat);
        ptr_next = &next;
    }
    foo get_data(){return data;}

    element_foo get_next(){return *ptr_next;}

    void print_array(){
        if (ptr_next == NULL) {
            std::cout<< data.get_attr()<<std::endl;
        }
        else {
            std::cout<< data.get_attr()<<std::endl;
            this->get_next().print_array();
        }

    }
};



int main (int argc, char * const argv[]) {
    // insert code here...  
    element_foo a1(10);
    element_foo a2(15,a1);
    element_foo a3(20,a2);

    a3.print_array();

    std::cout << "Hello, World!\n";
    return 0;
}

当我打印a3时,会出现分段错误...为什么?我的错在哪里?

2 个答案:

答案 0 :(得分:4)

错误在于此构造函数:

element_foo(int dat, element_foo next){
    data.set_attr(dat);
    ptr_next = &next;
}

您正在获取当地人的地址。 ptr_next = &next;函数结束后,地址无效。

您需要做的是将next作为指针传递:

element_foo(int dat, element_foo *next){
    data.set_attr(dat);
    ptr_next = next;
}

将主要内容改为:

element_foo a1(10);
element_foo a2(15,&a1);
element_foo a3(20,&a2);

编辑:

或者,您可以通过引用传递它:

element_foo(int dat, element_foo &next){
    data.set_attr(dat);
    ptr_next = &next;
}

答案 1 :(得分:1)

问题是您正在存储指向临时对象的指针。

'next'只是您传入a1 / a2 副本 ,因为它是按值复制的。您应该使用引用复制,以便&next完全引用a1 / a2的地址,而不是它们的副本。

                     v-------- should use "const element_foo &"
element_foo(int dat, element_foo next){
        data.set_attr(dat);
        ptr_next = &next;
    }

// a2->ptr_next is dangling
element_foo a2(15,a1);

执行上述行时,a2->ptr_next并未指向a1, 但是一个已被破坏的临时本地物体。 因此a2->ptr_next悬空。通过此指针进行的任何后续访问都有未定义的行为。