我正在完成家庭作业,我班上的老师不允许我们提问。他要求我们试图自己解决所有问题,但是我一直试图让这个问题在过去的一周内发挥作用,并且它会抛出同样的错误,我不知道为什么。我已经完成了一些谷歌搜索,并为那些有类似错误但无法找到解决方案的人浏览过。
它工作正常,直到它创建新数组并输入用户输入以开始填充新数组,然后它抛出:
6b.exe中0x000B517B的第一次机会异常:0xC0000005:Access 违规写入位置0x00008147。 程序'[4112] 6b.exe'已退出,代码为0(0x0)。
#include "stdafx.h"
#include <iostream>
using namespace std;
int* read_data(int& size){
size++;
return &size;
}
void main(){
int size = 0; // size is 0 to start
int max = 10; // set max to 10 to start
float user; //user imputed float number
cout << "Start entering your numbers.\n Be sure to hit RETURN between each one.\nWhen you are finished, hit 'Q'\n";
float *a = new float [max]; //set first array that can be deleted and replaced
do {
//if the array is full, make a new one and replace.
if(size == max){
max = max *2; //double max number
float *b = new float [max]; //create temporary array b
for (int i = 0; i < size; i++){
b[i] = a[i]; //copy old array to temporary
}
delete[] a; //remove old a array.
float *a = new float [max]; //create new a array with the new max, same name for the loop.
//copy new a array to resume filling
for(int i = 0; i< size; i++){
a[i] = b[i];
}
delete[] b; //remove temporary array to free memory.
}
cin >> user; // user inputs the number
a[size] = user; //user input
read_data(size); //increase size by one.
}while (!cin.fail());
size--; //remove one for the entering of Q otherwise it throws off the count.
if (cin.fail()){
cout << "\n\nYou have finished inputting.\n You have imputed " << size << " numbers. \nThe inputed numbers are as follows:\n";
for(int i=0; i < size; i++){
cout << a[i];
if (i == size -1){
cout << "\n\n";
}
else {
cout << ", ";
}
}
cout << "\n\n";
}
system("pause");
}
教师希望基本上每行都有评论,这就是为什么有这么多的。
如果有人能帮助我,那就太好了。
答案 0 :(得分:2)
delete[] a; //remove old a array.
这将删除您在a
函数外部范围内声明的main()
数组。
下一行:
float *a = new float [max];
这会在内部范围中创建一个名为a
的新变量。展望未来,您在a
开始时声明的原始main()
的内容正在发生在另一个a
上。原始的a
是“隐藏的”,因此,当此范围结束时,您分配的新数组将被泄露,而您的原始a
数组现在指向未分配的内存。
Hillarity随之而来。
“你越是越过管道,就越容易阻止它 排水“ - Scotty,Star Trek III。
分配新的b
数组并将a
的内容复制到其中后,您真正需要做的就是:
a=b;
您无需分配其他a
数组,并将其从b
复制回来,然后删除b
。这完全没有任何成就,这样做你无意中最终犯了一个相当邪恶的错误......