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)字符
问题
构造函数如何确保新的问题
中存在中立的“空数据”
您是否输入的问题或答案对于某个缓冲区来说太长?我敢打赌你是的,它超出了类的界限并破坏了堆栈。此外,混合使用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