【问题标题】:Heap and Pointer in C++C++中的堆和指针
【发布时间】:2013-05-07 13:53:03
【问题描述】:

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

编写一个函数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 变量吗?还是我的整个代码编码错误?

【问题讨论】:

  • ayuelkenbeck 的回答解决了您的问题,但请注意您的实施中还有其他问题。您的代码没有满足要求。
  • 所以你从cin 读取input 然后呢?您只需将下一个整数读入同一个变量即可将其丢弃。您不会将其存储在数组中。
  • @leemes 我写这个是为了将输入存储到数组中。 int* account_array [大小] = 输入;但大小不是 const 因此存在错误。我该如何解决它
  • 请不要完全更改问题,这会使现有答案无效。我回滚了你的编辑。您可以就您的问题提出另一个问题 - 或者更确切地说,做一些研究,因为之前有一千个人遇到过同样的问题。

标签: c++ arrays pointers heap-memory


【解决方案1】:

main()中需要将size初始化为0,不初始化,其值未定义。

【讨论】:

    【解决方案2】:

    所以...冒着为他们做某人的学校项目的风险(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;
        }
    

    【讨论】:

    • 那么我应该如何修复我的代码?我也很困惑我应该做什么。
    • ayuelkenbeck 的回答是正确的,我只是提供了一个简化代码的想法,同时也回答了上面 afriza 的反对意见。
    • 如果您要计算数字输入的数量,请将 size 初始化为 0,而不是 10。
    • 但我认为问题要求我先将数组的元素设置为 10。那么如果到达堆,数组项会加倍吗?
    【解决方案3】:

    从 10 个数组开始

    size 已声明但未初始化

    当数组填满时,大小加倍

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

    用户通过输入 Q 终止输入

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

    返回指向堆上数组的指针

    一个整数地址绝不是堆上的数组,而且,虽然一开始 size 是未初始化的,但在函数返回它之后它会返回该变量的 ADDRESS,所以在执行过程中稍后会出现巨大的数字,因此程序会尝试分配 4十亿个数字...

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

    所以我的建议:

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

    实际解析输入;

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

    解决这些问题,你就应该准备好了^.^

    【讨论】:

    • 但是如果我在 read_data 中声明我的大小,我如何从 main 调用 read_data,因为我需要再次初始化大小?
    • 哦,你是对的!我忘记了,如果没有在 main 中定义,你就不会知道结果大小,所以你无法访问它......抱歉,我忘记了 :)
    猜你喜欢
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 2021-08-14
    • 2015-08-05
    • 1970-01-01
    • 2012-02-05
    相关资源
    最近更新 更多