从头文件访问数组会使程序崩溃

Acessing an array from a header file crashes program

本文关键字:程序 崩溃 数组 文件 访问      更新时间:2023-10-16

我最近完成了一门关于c++的课程,为了测试看看我从中知道了什么,我决定开始一个操作系统模拟的工作,它似乎进展得相当顺利,直到我试图实现一个多用户系统,通过使用一个数组来存储用户名,用户将从中选择一个,它将进入他们的用户。然而,问题是,当我尝试修改源文件中头文件中的数组时,程序崩溃了。头文件:

#ifndef UBUNTU_LOGIN_H
#define UBUNTU_LOGIN_H
#include "Ubuntu_UserDetails.h"
#include <iostream>
#include <string>
#include <vector>
class Ubuntu_Login: protected UserDetails
{
public:
  void Ubuntu_UserCreation();
  void Ubuntu_login();
};
#endif // UBUNTU_LOGIN_H
#ifndef UBUNTU_USERDETAILS_H
#define UBUNTU_USERDETAILS_H
#include "Ubuntu_login.h"
#include <string>
#include <vector>
class UserDetails
{
protected:
  std::string username;
  std::string password;
  std::string users[0];
};
#endif // UBUNTU_USERDETAILS_H

源文件:

#include "Ubuntu_login.h"
#include "Ubuntu_UserDetails.h"
#include <iostream>
#include <vector>
#include <string>
void Ubuntu_Login::Ubuntu_UserCreation()
{
  std::cout << "t _____________" << std::endl;
  std::cout << "t|Create a user|n" << std::endl;
  std::cout << "Enter a username:" << std::endl;
  std::getline(std::cin, username);
  std::cout << "Enter a password:" << std::endl;
  std::getline(std::cin, password);
  users[0] = username;
  std::cout << users[0] << std::endl;
  std::cout << "User created successfully" << std::endl;
}

void Ubuntu_Login::Ubuntu_login()
{
  std::cout << "t ______" << std::endl;
  std::cout << "t|Log in|n" << std::endl;
  std::cout << "Select user" << std::endl;
}
#include "Ubuntu_login.h"
#include <iostream>

int main()
{
 Ubuntu_Login UO;
 UO.Ubuntu_UserCreation();
 UO.Ubuntu_login();
}

当我尝试运行它时,我得到了初始密码输入,然后程序崩溃了,我认为这是由于堆栈溢出,但我不知道如何解决它。对于解决这个问题的任何帮助以及对整个代码的一般帮助都将非常感激:)。

也是我没有包括像将密码存储为哈希或不回显密码这样的事情的原因,仅仅是因为我不知道这样做的语法,我想先尝试做我知道如何做的事情,然后再添加额外的功能,所以不要期待伟大的代码:p

使用std::vector<std::string> users

然后是users.push_back(username)

Ubuntu_UserDetails.h中,您在UserDetails类中有此数据成员:

std::string users[0];

然后在源文件中,你有这样的分配:

users[0] = username;

如果访问索引为0的数组中的项,则该数组必须至少有一个元素。实际上,索引0指的是数组中第一个项。

因此,users数组应该定义为更大的大小

但是,考虑为vector使用一个方便的c++容器类要好得多,比如 std::vector

在头文件中,你可以这样定义一个数据成员:

// Instead of:
//   std::string users[0]
//
std::vector<std::string> userNames; // probably better than "users"

然后,您可以使用push_backemplace_back方法向矢量添加新项。