我最近了解了指针,并且一直在努力去理解它们。但是,我遇到了麻烦。对于类,我们必须编写一个将数组加倍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;
}
那究竟是什么导致了这个问题,我该如何解决?也不确定这是否会实际打印数组的输出,但我也试图让它发生。感谢您的帮助!
答案 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;
}