【问题标题】:Having trouble doubling the size of a dynamic array in C++在 C++ 中将动态数组的大小加倍时遇到问题
【发布时间】:2018-01-30 01:51:22
【问题描述】:

我有一个将整数添加到数组的函数。如果空间用完,它应该将数组大小加倍并在下一个空闲点添加值。因此,如果数组大小为 3,我输入 99、105 和 45。现在,如果我想添加 100,则应该创建一个大小为 6 的新数组。下面有一个sn-p的代码。一切正常,我什至在本地函数中显示数组 [4],它返回 100。当程序返回 main 以再次显示菜单时,所有值都变为 -572662307。我花了几天的时间试图弄清楚这一点,但无法解决。谁能帮忙?

    //Snippet from Main

    cout<<"Enter the size of the array to be created";
    cin >> size;
    int *myArray = new int[size]();
    add(myArray,Size);

    //Problematic Code 
    void add (int Array[], int size){
       int* temp = new int[size*2]; // create new Array 2x The Size

       for (int i = 0; i < size; i++) {
           temp[i] = Array[i];//Copy data over
       }


       delete [] Array;//Delete the old array
       Array = temp;

       cout << "\n\nEnter a Number: ";
       cin >> newNumber;

       Array[sizeTrack] = newNumber;
       sizeTrack = sizeTrack++;

【问题讨论】:

  • std::vector不解决这类问题吗?
  • 请提供一个实际的 runnable 示例,而不是 sn-ps(它甚至不起作用,因为您在前几行中使用了例如 sizeSize ) 和开放式函数。
  • C++ 使用按值传递,除非您指定按引用传递(您没有指定)。函数中的Array = temp 对main 中的myArray 没有影响
  • 每当您想到“动态数组”时,下一个想法应该始终std::vector
  • 作业说要使用数组,我不确定我是否应该在网上发布我的整个作业,所以我只发布了导致问题的代码。

标签: c++ arrays pointers


【解决方案1】:

如果这是一个学校作业并且您不能使用std::vector,那么您需要知道通过将参数声明为int Array[],它实际上与int* Array 相同。你所拥有的是一个指针,当调用函数时你传递一个指针的副本

最后一部分很重要:您传递变量中值的副本。也就是说,当你修改函数内部的参数变量时,你只修改了copy。并且修改副本会使原始文件保持不变。

这里有两种可能的解决方案,你应该已经知道(通过你的课本和课堂笔记)或者应该能够在你的课本中找到它们:

  1. 返回新指针。
  2. 通过引用传递参数

【讨论】:

  • 或者传递一个指向指针的指针:void add (int **Array, int size) 然后当你改变 *Array 时就会发生正确的事情(我知道代码会变得难以维护......)
  • @JerryJeremiah 使用 C++ 时,实际上并不需要使用这种 C 风格的 hack 来 emulate 通过引用传递。 C++ 有本地引用。
  • 我还是有问题,我读了你说的,我想我理解了,但无法获得正确的语法。 Visual Studio 继续提供相同的输出或无法编译,因为参数 int** 与 int *** 或该错误的某些变体不兼容
  • @Wavvey213 请不要听 Jerry 的评论,这是不明智的。如果您不想返回新指针,请使用 references。你以前用过吗?在变量名之前使用&amp;?喜欢(在你的情况下)int*&amp; Array?如果您不知道这意味着什么,请阅读您的书籍
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 2021-01-08
  • 2020-12-29
相关资源
最近更新 更多