2016-12-30 2 views
0

Ich bin neu in C++ und das ist der Code, wo mein Zeiger Null wird, was mache ich falsch?Zeiger wird null C++

Hauptfunktion.

// in main() function 
switch (UserView::RequestMainMenuOption()) { 
    case 1: 
    { 
     struct user_info *user; // the pointer in question. 
     if (UserController::Login(user) && user) { // shows null here 
      std::cout << user->username << std::endl; // this line does not execute. 

-Controller.

bool UserController::Login(struct user_info *user) 
{ 
    //... 
    // std::cin username/password and validate in the user model. 
    if (User::ValidateCredentials(username, password, user)) {...} 
} 

Modell.

int User::ValidateCredentials(std::string username, std::string password, struct user_info *user) 
    { 
     // UserList is a vector of struct user_info that contains std::string username, password; 
     std::vector<user_info> UserList = User::GetUserList(); 
     // index is searched for here based on credentials... 
     // address of the element in the user list is assigned to user. 
     user = &UserList.at(index); 
     // address is successfully assigned (tested) 
     // but when returning back to the first function call in the main() function, user is NULL. 
+0

Sie wahrscheinlich das Argument 'Login()' durch Verweis übergeben werden sollen. –

+0

Sie übergeben "Benutzer", überall, nach Wert. Das bedeutet, dass das Setzen von "user" innerhalb dieser Funktion absolut keinen Effekt hat. Sie müssen "Benutzer" als Referenz anstelle von Wert übergeben. Überprüfen Sie das Material in Ihrem C++ - Buch, in dem es darum geht, Funktionsparameter nach Wert und nach Referenz zu übergeben. –

+1

Sie deklarieren nur 'struct user_info * user;' und nicht allozieren, also ist es NULL, aber Sie haben Glück, denn wenn Sie nicht im Debug-Modus waren, könnte es Müll enthalten und Ihren Code als Müll –

Antwort

0

Der Zeiger nicht oder kann nicht null sein kann, aber noch wichtiger ist es uninitialised:

struct user_info *user /* = ???? initialise here */; // the pointer in question. 
if (UserController::Login(user) && user) { // shows null here 
    std::cout << user->username << std::endl; // this line does not execute. 

die unter EDITED es dank Quentin

Es ist für die Arbeit sicher zu machen weil Ihr Compiler im Debug-Modus auf Null gesetzt ist. Sie wollen:

std::unique_ptr<user_info> user = std::make_unique<user_info)>(/* constructor arguments go here */); 

oder wenn das Objekt geteilt wird:

std::shared_ptr<user_info> user = std::make_shared<user_info)>(/* constructor arguments go here */); 
+0

Argh, roh besitzende Zeiger ... – Quentin