无效指针

Invalid Pointer?

本文关键字:指针 无效      更新时间:2023-10-16

我最近了解了指针,并且一直在努力真正理解它们。但是,我遇到了麻烦。对于类,我们必须编写一个函数,该函数将使数组 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;
}

那么究竟是什么导致了问题,我该如何解决呢?也不确定这是否真的会打印数组的输出,但我也在尝试实现这一目标。感谢您的任何帮助!

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

要修复它,请仅将该函数与动态分配的数组一起使用。

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

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

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

你的代码最大的问题是这一行: 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("%dn", repeated[i]);
  }
  delete[] (repeated);
  return 0;
}