Почему 0-й индекс этого массива все еще не равен 0? - PullRequest
0 голосов
/ 08 декабря 2018

В следующем коде строка 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 голосов
/ 08 декабря 2018

В случае конструктора по умолчанию вы объявляете bar [1] как локальную переменную для конструктора, и эта строка -> _ указывает на область памяти панели.Так как область видимости bar [1] заканчивается в последней строке конструктора, foo2 будет указывать на некоторое значение мусора вместо 0. Вы можете сделать что-то подобное или объявить bar [1] как статическую переменную.

class Foo {
    public:
        int* _bar;
        int bar = 0;
        Foo() {
            this->_bar = &bar;
        }
        Foo(int* bar) {
        this->_bar = bar;
   }
};
0 голосов
/ 08 декабря 2018

В случае foo2, bar[1] является локальной переменной массива внутри конструктора.Он не будет доступен после завершения конструктора.

И так как вы сохраняете его как указатель, когда это пространство в стеке используется для чего-то еще, вы получите данные из этого места;вероятный мусор.

Если бы bar[1] внутри конструктора была переменной static, это сработало бы для вас.Конечно, я понимаю, что это всего лишь тестовый код, и вы не сделали бы это в реальном коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...