C ++中的堆和指针

时间:2013-05-13 13:42:11

标签: c++ arrays pointers heap

我对指针有疑问。这是我的问题:

  

编写一个函数int* read_data(int& size),从cin读取数据,直到用户通过输入Q终止输入。该函数应将size参数设置为数字输入的数量。返回指向堆上数组的指针。该数组应具有完全大小的元素。当然,您不会在一开始就知道用户将输入多少元素。从10个元素的数组开始,每当数组填满时,大小加倍。最后,分配一个正确大小的数组并将所有输入复制到其中。一定要删除任何中间数组。

这是我的代码:

int* read_data(int& size);
int main()
{
    int size ;
    int* account_pointer = read_data(size);
    int* account_array = new int[size];

    int* bigger_array = new int[2 * size];
    for (int i = 0; i < size; i++)
    {
        bigger_array[i] = account_array[i];
    }
    delete[] account_array;
    account_array = bigger_array;
    size = 2 * size;

    system("PAUSE");
    return 0;
}

int* read_data(int& size)
{
    int input;
    cout << "Enter integer, Q to quit : " ;
    while(cin >> input)
    {
        size++;
    }
    return &size;
}

但是,当我插入非数字时,我收到一条错误消息。错误消息为Debug Error! Invalid allocation size : 4294967295 bytes。我是否错误地在main方法中声明了size变量?或者我的整个代码都被错误编码了?

3 个答案:

答案 0 :(得分:6)

main()中,您需要将size初始化为0.如果没有初始化,则其值是未定义的。

答案 1 :(得分:1)

所以...冒着为他们做某人学校项目的风险( ahem )这就是我要做的事情:

    #include "stdafx.h"
    #include <iostream>

    int* read_data(int& size);

    int _tmain(int argc, _TCHAR* argv[])
    {
        int size = 0;
        int* result = read_data(size);

        int* end = new int[size];
        for(int i=0;i<size;i++)
            end[i] = result[i];


        for(int i=0;i<size;i++)
            std::cout<<end[i];

        delete []end;
        delete []result;

        return 0;
    }



    int* read_data(int& size)
    {
        int input;

        int arraySize = 10;
        int *arrInt = new int[arraySize];

        std::cout << "Enter integer, Q to quit : " ;
        while(std::cin >> input)
        {        
            arrInt[size++] = input;

            if(size >= arraySize)  //time to resize
            {
                arraySize *= 2;  //double size

                int* arrInt2 = new int [arraySize];

                for(int i=0;i<size;i++)
                {
                    arrInt2[i] = arrInt[i];
                }

                delete [] arrInt;
                arrInt = arrInt2;
            }
        }

        return arrInt;
    }

答案 2 :(得分:1)

  

从数组10开始

宣布规模但尚未初始化

  每当阵列填满时

加倍

这个^步骤应该在read_data(..)中,而不是在main()中,也应该是自动的。

  

用户通过输入Q

来终止输入

在此代码段中,您提供的方法无法测试可能的输入。

  

返回指向堆上数组的指针

整数地址绝不是堆上的数组,而且,虽然大小最初是未初始化的,但是在函数返回之后它返回该变量的ADDRESS,因此在执行期间会出现大量数字,因此程序尝试分配4数十亿......

上一期我可以看到a.t.m.是你丢弃任何用户输入,而不是将其输入任何阵列......

所以我的提示:

移动大小声明和所需的任何变量,包括数组INSIDE read_data(...);

实际解析输入;

使read_data(...)实际上返回它应该的内容。

修复这些,你应该全部设置^。^