代码之家  ›  专栏  ›  技术社区  ›  Steven

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

  •  0
  • Steven  · 技术社区  · 5 年前

    在下面的代码中, 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 回复  |  直到 5 年前
        1
  •  3
  •   anishsane    5 年前

    foo2 案例, bar[1] 是构造函数内的局部数组变量。一旦构造函数结束,就无法访问它。

    因为你把它存储为指针,当堆栈上的空间被用来做其他事情时,你会从那个位置得到数据;可能是垃圾。

    如果 酒吧〔1〕 在构造器里面有一个 static 变量,对你有用。当然,我知道这只是一个测试代码,你不可能在真正的代码中这样做。

        2
  •  1
  •   avr_dude    5 年前

    在默认构造函数情况下,您将bar[1]声明为构造函数的局部变量,而此->_bar指向该条的内存位置。由于BAR(1)作用域在构造函数的最后一行结束,所以FoO2将指向一些垃圾值而不是0。您可以这样做,或者声明条(1)作为静态变量。

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