C++ 错误0xC0000005:从函数C+返回时发生访问冲突+;

C++ 错误0xC0000005:从函数C+返回时发生访问冲突+;,c++,C++,我是这门语言的初学者,我遇到过这个问题。在网上搜索后,它似乎与内存分配、指针等有关。。我不太明白。。。。在这里,我试图通过类将数据添加到二进制文件中。。。 所以我想问问题是什么--> 对于整个程序,我将代码粘贴在这里 请看一下……因为我无法在这里这样做有一个明显的问题,还有许多潜在的问题。您的症状表明某个值被写入了内存中不应该存在的位置(缓冲区溢出、浮点指针等) 担心 >不要将C++标准流I/O(STD::CUT,STD:CERP,STD:CIN,STD::OFFROW,以及许多更多的元素)与

我是这门语言的初学者,我遇到过这个问题。在网上搜索后,它似乎与内存分配、指针等有关。。我不太明白。。。。在这里,我试图通过类将数据添加到二进制文件中。。。 所以我想问问题是什么-->

对于整个程序,我将代码粘贴在这里
请看一下……因为我无法在这里这样做

有一个明显的问题,还有许多潜在的问题。您的症状表明某个值被写入了内存中不应该存在的位置(缓冲区溢出、浮点指针等)

担心 <> >不要将C++标准流I/O(STD::CUT,STD:CERP,STD:CIN,STD::OFFROW,以及许多更多的元素)与C风格的标准I/O()混合。选择,并坚持下去

  • 检查并验证关于边界条件的假设。本例中的边界是
    question
    中输入字符数组的大小。您的输入数据是否接近/接近数组大小(您定义的限制)?在每个字符数组的末尾是否允许额外的终止NULL(0)字符

  • 预先初始化您将要处理的所有内容。您的
    问题
    构造函数如何确保新的
    问题
    中存在中立的“空数据”

  • 策略-隔离问题
  • 注释掉整个函数体(所有语句),使函数为空。运行并验证它是否工作-这将确定问题是在身体还是其他地方

  • 开始重新添加位。准确确定触发问题的语句。对于访问违规,人们担心这种类型的代码分类可能无法揭示真正的罪魁祸首

  • 除了:缓冲区溢出、浮点指针等可能在问题发生后的任何时间、任何地点导致问题。世界上所有的问题隔离可能无法确定问题的根源。你将培养识别常见问题的技能。以上几点是帮助你发展这些技能的一些入门指南

    风格
  • 声明每个变量,使其尽可能接近代码中的第一个使用点。考虑将声明用于<代码> fOut下来。

  • 您是否输入的问题或答案对于某个缓冲区来说太长?我敢打赌你是的,它超出了类的界限并破坏了堆栈。此外,混合使用cin和cout以及gets等C风格的IO函数会带来麻烦,所以不要这样做

    因为你使用C++,你不必做字符串操作作为字符数组。有一个STL类可以为您处理所有的内存垃圾。我会用以下方式重写你的课程:

    class Question
    {   public:
        string ques;
        string option1, option2, option3, option4;
        char k;
        char quesno;
    
        void write(fstream& f)
        {
            f << ques.length() << " " << ques << endl
              << option1.length() << " " << option1 << endl
              << option2.length() << " " << option2 << endl
              << option3.length() << " " << option3 << endl
              << option4.length() << " " << option4 << endl
              << k << " " << quesno << endl;
        }
    };
    
    void addques()
    {
        Question abc;
        ofstream fout;
        fout.open("question.txt", ios::app);
    
        cout << "Enter Question!" << endl;
        getline (cin, abc.ques);
    
        cout << "Enter Options!\n";
        getline(cin, abc.option1);
        getline(cin, abc.option2);
        getline(cin, abc.option3);
        getline(cin, abc.option4);
    
        cout << "Enter correct option number: ";
        cin >> abc.k;
    
        cout << "Enter question number: ";
        cin >> abc.quesno;
    
        // you will have to change your writing method a bit because you can't just write the string object straight to disk like you were before
    
        abc.write(fout);
        fout.close();
    }
    
    int i = ques.length();
    fout.write((const char *) &i, sizeof(i));
    
    这将直接将32位整数值写入流,而不首先将其转换为字符串。您的字符串将采用以下格式:

    +     0x0     0x1     0x2     0x3     0x4     0x5     0x6     0x7     
    0x0  [0x00    0x00    0x00    0xC0  ][H       E       L       L
    0x8   O       <space> W       O       R       L       D       <null> ]
    
    如果编译器不知道数组有多大,您将得到指向第一个元素的指针的大小。所以要小心。不能对指针使用sizeof来确定数组大小

    int derp2[];
    sizeof(derp2); // sizeof(int *), probably 4 or 8
    int * derp3 = derp;
    sizeof(derp3); // sizeof(int *), probably 4 or 8
    
    要获取std::string(STL string类)的长度,请使用length成员:

    string hurr = "hello world";
    hurr.length(); // does NOT include the null terminator
                   // length of string AND terminator is hurr.length() + 1
    

    发布你的问题类的析构函数。请发布
    问题的源代码。我猜答案与“你不太明白”有关。但是,在你为你的
    问题发布代码之前,没有人会知道。你有没有想过将代码减少到显示问题的最低限度?请学会用可读的格式来表达你的问题…@Harsh:dependens,你发布的代码越少,越容易理解,但是如果你发布的代码很少,你的代码就不会包含错误。因此,最好的选择是删除尽可能多的代码,同时仍然从程序中获取错误(通过注释),并只发布剩余的内容。因此,我应该使用cin.getline而不是get?这是一个合理的选项。这是一个很好的开始。你所说的“使用'gets'意味着它最好使用字符数组,或者最坏情况下使用指针引用“nothing”是什么意思。我不明白这个partgets只适用于字符数组和指针。在C++中,一般认为使用字符串是更好的。所以,如果处理字符数组,那么GET就更好了。除了(天知道为什么),他还是很好地做二进制I/O。他只不过是把结构的内存内容写在磁盘上,但是,让格式化的插入和提取处理这个问题可能更容易。此外,ascii只是二进制文件的一个子集。实际上,这是我必须在学校提交的一个项目,我们必须使用二进制文件处理数据文件,所以我必须使用它,但是,我又遇到了各种各样的问题,这些问题超出了我的理解能力,我无法理解并修改代码,然后将长度存储为二进制整数,而不是格式化字符串。“我会在我的答案中加上一个例子。@RichardSitze:他直到对我的答案发表评论才承认这是家庭作业。”。也就是说,我给了他一个ascii实现。将其转换为二进制对他来说是一项练习。我给了他一个合作的想法,我会让他把这些点和一个可行的解决方案联系起来。
    
    int derp[1000];
    sizeof(derp); // sizeof(int) * 1000
    
    int derp2[];
    sizeof(derp2); // sizeof(int *), probably 4 or 8
    int * derp3 = derp;
    sizeof(derp3); // sizeof(int *), probably 4 or 8
    
    string hurr = "hello world";
    hurr.length(); // does NOT include the null terminator
                   // length of string AND terminator is hurr.length() + 1