这是一个我从未见过的奇怪错误,并且不知道如何修复它。崩溃发生在
上 na = m
这是相关代码。有问题的行标有*:
在Main:
#include <cstdlib>
#include <iostream>
#include "stu.h"
#include <string>
#include <iomanip>
using namespace std;
int main(int argc, char *argv[])
{
stu stu;
int score[2];
std::string name;
std::cout <<"enter name:";
std::cin >> name;
//THIS IS AN EDIT IN AFTER SEEING THAT A IMPORTANT ERROR POINT WAS NOT SHOWN TO THE FIRST COUPLE REPLY
************************************************************
//THIS IS CAUSING THE PROBLEM WHEN I COMMENT IT OUT THE PROGRAM WORKS
std::cout << "enter score 1:";
std::cin >> score[0];
std::cout << "enter score 2:";
std::cin >> score[2];
std::cout << "enter score 3:";
std::cin >> score[3];
*************************************************************
stu.setname( name );
// ...
}
在stu.ccp
:
void stu::setname(std::string m)
{
std::cout <<"1";//<--to find where the code was crashing
na = m; // *** the crash
std::cout <<"1";
}
在stu.hpp
:
class stu
#include <string>
{
public:
stu();
void setname(std::string);
std::string getname();
void settest(int, int,int);
void display();
private:
std::string na;
int score[2];
};
答案 0 :(得分:1)
定义int score[2]
时,您得到一个2 int
的数组,有效数组索引为0..1
。
您的后续代码会写入数组的末尾,并在内存中跟踪它后面的内容,在本例中为字符串对象name
。
std::cout << "enter score 1:";
std::cin >> score[0];
std::cout << "enter score 2:";
std::cin >> score[2];
std::cout << "enter score 3:";
std::cin >> score[3];
最后两个数组引用不正确。
答案 1 :(得分:1)
您为数组中的两个整数分配了足够的空间,具有有效索引0
和1
。
int score[2];
然后你试图阅读比那更多的元素
std::cin >> score[2];
std::cout << "enter score 3:";
std::cin >> score[3];
这是未定义的行为,允许发生任何,包括整个计算机在火球中消失。在你的情况下,它覆盖了数组旁边的内存,这是你的string
变量。复制损坏的字符串很容易导致程序崩溃。
答案 2 :(得分:0)
我已经尝试过你的代码,它编译并运行没有问题。
除了您提供的内容之外,我刚刚定义了构造函数,在#include <string>
class stu
之前移动了stu.h
并删除了std::cout << "1"
。
答案 3 :(得分:0)
int score [2]
只有得分[0]和得分值[1]。使用 尝试
int score[3]
然后将您的值存储在
中 score[0];
score[1];
score[2];