指针无效?

时间:2016-02-02 20:17:10

标签: c++ pointers

我最近了解了指针,并且一直在努力去理解它们。但是,我遇到了麻烦。对于类,我们必须编写一个将数组加倍x次的函数。我能够在没有任何实际问题的情况下编写该函数,但我正在尝试将其实现为实际代码,并且我继续得到无效的指针错误。这是代码:

#include <iostream>
using namespace std;

int *ArrayDoubling(int inputArray[], int initialSize, int numberToDouble);

int main(){
    int arr[2] = {0,1};
    int array_size = 2;
    int number = 3;

    ArrayDoubling(arr, array_size, number);
}

int *ArrayDoubling(int inputArray[], int initialSize, int numberToDouble){
    for(int i=0;i<numberToDouble;i++){
        int *array2 = new int[initialSize*2];
        for(int i=0;i<initialSize;i++){
            array2[i] = inputArray[i];
        array2[i+initialSize] = inputArray[i]*2;
        }
        initialSize = initialSize*2;
        delete []inputArray;
        inputArray = array2;
    }
    return inputArray;
}

那究竟是什么导致了这个问题,我该如何解决?也不确定这是否会实际打印数组的输出,但我也试图让它发生。感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

ArrayDoubling函数在delete[]参数上调用inputArray。但是当你在main中调用它时,你会将指针传递给自动数组。使用您未从delete[]获取的指针调用new[]具有未定义的行为。

要解决此问题,请仅使用具有动态分配数组的函数。

答案 1 :(得分:0)

你的内循环循环次数加倍,而不是数组的大小。对于数组大小小于要加倍的次数的输入,您将访问超出范围的索引。

答案 2 :(得分:0)

我不太确定你的意图是什么,但我认为你的第二个for循环应该是这样的:

for(int i=0;i<initialSize;i++)

答案 3 :(得分:0)

您的代码最大的问题是这一行:delete []inputArray;

inputArray最初声明为int arr[2] = {0,1};,不应删除。您只能删除使用关键字new创建的变量。

从广义上讲,你的程序需要看起来像这样。请注意new[]ArrayRepeat中的人口循环外发生,所以它只被调用一次,同样delete[]只会被调用一次,在同一个指针上是通过new[]创建的。

// dynamically allocate an array which contains the first `N` elements of 
//   `array` repeated `repeats` times.
int * ArrayRepeat (int * array, size_t N, int repeats) {
  int * result = new int[N * repeats];
  assert(result); // Error check

  // Loops to populate result goes here

  return result;
}

int main (void) {
  int arr[] = {0, 1};
  int * repeated = ArrayRepeat(arr, 2, 3);

  // Print the result
  for (int i = 0; i < 2 * 3; ++i) {
    printf("%d\n", repeated[i]);
  }

  delete[] (repeated);

  return 0;
}