Использование указателей для возврата значения - программные сбои - PullRequest
0 голосов
/ 17 марта 2012

Я новичок в C ++ и экспериментирую с использованием указателей для возврата значений. Я написал простую программу, но не могу понять, почему она вылетает.

main.cpp

int main() {
    bool *pMyBool;

    bar myBar;
    myBar.foo(pMyBool);

    cout << *pMyBool << endl;

    return 0;
}

bar.cpp

int bar::foo(bool *pMyBool) {
    bool myBool = true;
    *pMyBool = myBool;
    return 0;
}

выход

1
//then it crashes

Ответы [ 4 ]

4 голосов
/ 17 марта 2012

Вы не инициализируете pMyBool в main(), поэтому он указывает на случайную память, а затем происходит сбой программы, поскольку случайная память не является действительной памятью.

Одно из возможных исправлений:

int main() {
    bool  value;
    bool *pMyBool = &value;

    bar myBar;
    myBar.foo(pMyBool);

    cout << *pMyBool << endl;

    return 0;
}

С указателями вы всегда должны убедиться, что вы инициализировали их, чтобы они указывали куда-то, прежде чем пытаться их использовать. Всегда!

3 голосов
/ 17 марта 2012

В C ++ вы не хотите использовать указатели в вашем случае, но использовать ссылки :

int bar::foo(bool &MyBool) {
   MyBool = true;
   return 0;
}

Конечно, вы просто позвоните со своего main

   bool MyMainBool = false;
   bar.foo(MyMainBool);
2 голосов
/ 17 марта 2012

pMyBool не указывает ни на одно действительное местоположение. Так что вы не можете разыменовать его.
Вы должны сначала выделить память, и сделать указатель, указать на него. bool *pMyBool = new bool;
и позже освободить память. delete pMyBool;

0 голосов
/ 17 марта 2012

это потому, что myBool размещен в «стеке» (локальные переменные);при выходе из функции foo стек, связанный с foo, освобождается, поэтому указатель pMyBool указывает на недопустимый адрес памяти.

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