繁体   English   中英

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

[英]Error 0xC0000005: Access Violation when returning from a function C++

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

void addques()
{
    question abc;
    ofstream fout;
    fout.open("question.txt",ios::app|ios::binary);
    cout<<"Enter Question!\n";
    gets(abc.ques);
    cout<<"Enter Options!\n";
    gets(abc.option1);gets(abc.option2);gets(abc.option3);gets(abc.option4);
    cout<<"Enter correct option number\n";
    cin>>abc.k;
    cout<<"Enter question nummber"; cin>>abc.quesno;
    fout.write((char*)&abc,sizeof(abc));
    fout.close();
    cout<<"File closed";
}

似乎所有具有ifstream / ofstream类对象的函数都显示此错误。 最后一行“文件已关闭”也正在执行,之后出现错误。 可能是这一行 - fout.write((char*)&abc,sizeof(abc)) ; ??? 请帮助

这是相关的类 - >

class question
{   public:
    char ques[80];
    char option1[50], option2[50], option3[50], option4[50];
    char k;
    char quesno;
};

对于整个程序,我在这里粘贴了我的代码http://pastebin.com/S7KNby0E请注意......因为我无法在这里这样做

您是否输入了一个问题或答案,这个问题或答案对您的某个缓冲区来说太长了? 我敢打赌你是,并且它超越了类的界限并破坏了堆栈。 另外,混合cin和cout以及类似于C的IO风格的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();
}

然后,您应该能够使用提取运算符将一个读取到流中,或多或少与写入工作方式相同。

Ascii到二进制

由于必须使用二进制,因此可以通过以下方式将整数值存储为二进制值:

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> ]

长度是前4个字节,此处显示为0x0000000C(整数值12)。 该字符串紧随其后,其值为“HELLO WORLD \\ 0”。 \\ 0是空终止符。 在我的示例中,此长度包括null终止符。

的sizeof

Sizeof是一个运算符,它在编译器可以确定的最佳内容中生成指定类型的内存大小。 对于整数类型,例如int,short,char等,它将返回该类型使用的字节数。 对于数组,您可能会遇到令人困惑的行为。 如果在静态声明的数组上调用固定大小,则sizeof将返回数组长度*一个元素的大小。

int derp[1000];
sizeof(derp); // sizeof(int) * 1000

如果编译器不知道数组有多大,那么你得到的是指向第一个元素的指针的大小。 所以要小心。 您不能在指针上使用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字符串类)的长度,请使用length成员:

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

有一个明显的问题,以及许多潜在的问题。 你的症状表明一个值被写入内存它应该没有的地方(缓冲区溢出,浮动指针等)。

关注

  1. 不要将C ++标准流I / O(std :: cout,std:cerr,std:cin,std :: ofstream和许多其他元素)与C风格的标准I / O( 获取 )混合使用。 选择一个I / O库 ,并坚持下去。

  2. 检查并验证您对边界条件的假设。 你在这种情况下边界是在你输入字符数组的大小question 您的输入数据是接近/接近数组大小(您定义的限制)吗? 你是否允许在每个char数组的末尾留出额外的终止NULL(0)字符?

  3. 预先初始化您将要使用的所有内容。 您的question构造函数可以做些什么来确保新question存在中性“空数据”?

策略 - 隔离问题

  1. 注释掉整个函数体(所有语句),将函数留空。 运行并验证它是否有效 - 这将识别问题是在身体中还是在其他地方。

  2. 重新开始添加位。确切地确定哪个语句触发了问题。 有访问违规的问题是,这种类型的代码分类可能无法揭示真正的罪魁祸首。

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

样式

  1. 声明每个变量尽可能接近它在代码中首次使用的点。 考虑移动fout的声明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM