0

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

编写一个函数int* read_data(int& size)来读取数据,cin直到用户通过输入 Q 终止输入。该函数应将大小参考参数设置为数字输入的数量。返回指向堆上数组的指针。该数组应该具有完全大小的元素。当然,您一开始并不知道用户将输入多少个元素。从包含 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 变量吗?还是我的整个代码编码错误?

4

3 回答 3

6

main()你需要初始化大小为0。没有初始化,它的值是未定义的。

于 2013-05-13T13:44:29.650 回答
1

从 10 个数组开始

size 已声明但未初始化

每当数组填满时,大小加倍

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

用户通过输入 Q 终止输入

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

返回指向堆上数组的指针

整数地址绝不是堆上的数组,此外,虽然最初未初始化大小,但在函数返回它之后,它返回该变量的 ADDRESS,因此在执行过程中稍后会出现巨大的数字,因此程序尝试分配 40 亿个数字。 ..

我可以看到 atm 的最后一个问题是您丢弃任何用户输入,而不是将其输入任何数组......

所以我的提示:

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

实际解析输入;

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

修好这些,你应该都准备好了^.^

于 2013-05-13T14:34:24.050 回答
1

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

    #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;
    }
于 2013-05-13T13:51:24.830 回答