为什么此数组的第0个索引仍不等于0?

时间:2018-12-08 04:44:50

标签: c++ c++11 pointers

在下面的代码中,行to_string(foo1->_bar[0])返回"0",正如人们所期望的那样。但是,行to_string(foo2->_bar[0])返回一些其他(看似随机的)整数。为什么是这样?我该怎么做才能使代码以预期的方式起作用? (即,使Foo的默认构造函数将等于{0}的整数数组分配给_bar。)

#include <iostream>

using namespace std;

class Foo {
public:
    int* _bar;
    Foo() {
        int bar[1] = {0};
        this->_bar = bar;
    }
    Foo(int* bar) {
        this->_bar = bar;
    }
};

int main()
{    
    int bar[1] = {0};
    Foo* foo1 = new Foo(bar);
    cout << to_string(foo1->_bar[0]) << "\n";

    Foo* foo2 = new Foo();
    cout << to_string(foo2->_bar[0]) << "\n";

    return 0;
}

2 个答案:

答案 0 :(得分:3)

foo2情况下,bar[1]是构造函数内部的局部数组变量。构造函数结束后将无法访问。

由于您将其存储为指针,因此当堆栈上的该空间用于其他任何用途时,您将从该位置获取数据;可能是垃圾。

如果构造函数中的bar[1]是一个static变量,它将为您工作。当然,我知道这只是测试代码,您不会在真实代码中这样做。

答案 1 :(得分:1)

在默认构造函数的情况下,您将bar [1]声明为构造函数的局部变量,而this-> _ bar指向bar的内存位置。由于bar [1]范围在构造函数的最后一行结束,因此foo2将指向某个垃圾值而不是0。您可以执行类似操作或将bar [1]声明为静态变量。

class Foo {
    public:
        int* _bar;
        int bar = 0;
        Foo() {
            this->_bar = &bar;
        }
        Foo(int* bar) {
        this->_bar = bar;
   }
};