创建新数组

时间:2016-05-25 01:50:57

标签: c++

我正在完成家庭作业,我班上的老师不允许我们提问。他要求我们试图自己解决所有问题,但是我一直试图让这个问题在过去的一周内发挥作用,并且它会抛出同样的错误,我不知道为什么。我已经完成了一些谷歌搜索,并为那些有类似错误但无法找到解决方案的人浏览过。

它工作正常,直到它创建新数组并输入用户输入以开始填充新数组,然后它抛出:

  

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"); 
}

教师希望基本上每行都有评论,这就是为什么有这么多的。

如果有人能帮助我,那就太好了。

1 个答案:

答案 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。这完全没有任何成就,这样做你无意中最终犯了一个相当邪恶的错误......