从头文件访问数组会使程序崩溃
Acessing an array from a header file crashes program
我最近完成了一门关于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_back
或emplace_back
方法向矢量添加新项。
相关文章:
- 程序崩溃并显示"std::out_of_range"错误
- 试图创建流或fopen时程序崩溃
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 如何找出应用程序崩溃的原因 - Win 10 LTSB
- 操纵安卓相机的深度图导致应用程序崩溃
- 为什么当我尝试搜索双链表中第一个数据条目之外的数据时,程序崩溃了?
- DLL Made with CMake 使程序崩溃
- 程序崩溃使用boost::asio
- 调用 free() 有时会导致程序崩溃
- 邮件加密程序崩溃
- 调用 java 的回调() 时应用程序崩溃.由于 detatchThread 而获得运行时错误
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- For 循环在尝试读取数组 c++ 时程序崩溃
- 即使有 0 个错误,Getter 似乎也会使程序崩溃
- Windows桌面程序保存您的计算机会话 - 基于程序崩溃时的恢复会话
- 无法访问的代码如何导致我的程序崩溃?
- 矢量迭代器在尝试调用函数时使我的程序崩溃
- QCompleter set模型使应用程序崩溃
- 使用唯一指针调用函数会使我的程序崩溃
- 删除SDL_PollEvent时程序崩溃