通过新的后传递后创建的动态数组的错误以调整函数
Errors with dynamic Array created with new after passed to resize function
我正在尝试使用我要调整大小的new
动态创建的数组,但调整大小操作无法正常工作。
这是对动态数组的练习,因此我需要使用new
而不是std::vector
的动态阵列。
这是我的代码:
int main ()
{
// Build an application here
int length = 0;
int size = 0;
int input;
bool endAdding = false;
cout << "Please enter the length of the new array : ";
cin >> length;
int* oPtrDynamicArray = CreateDynamicArray (length, size);
do
{
cout << "Add an element (0 to quit) : " << endl;
cin >> input;
cout << endl << endl;
if (input == 0){
endAdding = true;
}
else
{
InsertElement(oPtrDynamicArray, input, size, length);
}
cout << "The array contains : " << endl;
for (int i = 0; i < size; i++)
{
cout << i << ": [" << oPtrDynamicArray[i] << "]" << endl;
}
} while (!endAdding);
DeleteDynamicArray (oPtrDynamicArray, size);
}
int *CreateDynamicArray (int capacity, int &size)
{
size = 0;
return new int[capacity];
}
void DeleteDynamicArray (int *dynamicArray, int &size)
{
delete[] dynamicArray;
dynamicArray = nullptr;
size = 0;
}
void InsertElement (int *dynamicArray, int element, int &size, int capacity)
{
if (capacity <= size)
{
ResizeDynamicArray (&dynamicArray, size+1);
}
dynamicArray[size] = element;
size++;
}
void ResizeDynamicArray (int **dynamicArray, int newCapacity)
{
int ** newArray = new int*[newCapacity];
for (int i = 0; i < newCapacity; i++)
{
newArray[i] = dynamicArray[i];
}
*dynamicArray = *newArray;
delete[] newArray;
newArray = nullptr;
}
问题在于,数组才传递给我的InsertElement()
函数,然后仅当capacity <= size
(但是将数组传递给第一个函数(传递给第一个函数时才传递给ResizeDynamicArray()
,但具有良好的值,但在数组中带有异常的指针。
示例:
对于3个数组,我有:
array [0] = 1-> adress 0x0004e300包含值1
array [1] = 2-> adress 0x00000003包含???
array [2] = 3-> adress 0x008ffb24包含值2
我真的不明白,如果有人可以解释我的错误,那真的很棒:/。
问题在这里
void InsertElement (int *dynamicArray, int element, int &size, int capacity)
{
if (capacity <= size)
{
ResizeDynamicArray (&dynamicArray, size+1);
}
dynamicArray[size] = element;
size++;
}
调用ResizeDynamicArray
时,您将更改为InsertElement
的dynamicArray
指针。您是不是更改Main中的oPtrDynamicArray
指针。
如果要进行这项工作,则需要更改InsertElement
才能进行双重指针(就像ResizeDynamicArray
一样(
void InsertElement (int **dynamicArray, int element, int &size, int capacity)
{
if (capacity <= size)
{
ResizeDynamicArray (dynamicArray, size+1);
}
(*dynamicArray)[size] = element;
size++;
}
,或者您可以做简单的事情,只使用std::vector<int>
。
编辑现在我将其查看您的ResizeDynamicArray
功能,我看到该功能也完全错误。很明显,您与指针有关
以下是ResizeDynamicArray
的方式
void ResizeDynamicArray (int **dynamicArray, int newCapacity)
{
int * newArray = new int[newCapacity];
for (int i = 0; i < newCapacity; i++)
{
newArray[i] = (*dynamicArray)[i];
}
delete[] *dynamicArray;
*dynamicArray = newArray;
}
您不是第一个无法理解指针的新手。很好地了解上面的代码,并将其与您的代码进行比较。主要区别是我的代码使用指针更改的指向。您的代码试图更改指针本身,这是不正确的。这是令人困惑的,因为被指向的是另一个指针(动态数组(。
您的代码中有几个问题:
首先,在ResizeDynamicArray
中,您将 Pointers 的数组分配给INT,而不是INT数组。int ** newArray = new int*[newCapacity]
应该是int *newArray = new int[newCapacity]
。
第二,一旦修复了,就需要编写*dynamicArray = newArray;
;但是您应该在之前释放旧数组您将指针分配给新的内存块。
void ResizeDynamicArray (int **dynamicArray, int newCapacity)
{
int *newArray = new int[newCapacity];
for (int i = 0; i < newCapacity; i++)
{
newArray[i] = (*dynamicArray)[i];
}
delete[] *dynamicArray;
*dynamicArray = newArray;
}
第三,由于InsertElement
可能会调用ResizeDynamicArray
(这将使您回到新的内存块(,因此您需要更改最初传递的指针。因此,就像使用ResizeDynamicArray
一样
void InsertElement (int **dynamicArray, int element, int &size, int capacity)
然后相应地调整身体。
我知道问题已经回答,但没有回答。
您必须牢记指针传递给函数按值。指向其指向的地址的指针值在函数结束时会丢失。但是您仍然能够通过指出指针来更改指向其指向的地址的值。
要传递可以更改指针值,地址指向,在功能中,您必须将指针传递给指针。在这种情况下,传递双重指针是通过参考。 void Foo(int **ptr)
{
// Don't use ptr, changes are lost after function end as ptr is a local copy
// Use *ptr to change the value of the pointer you passed to the function.
// Use **ptr to change the value at the address the pointer you passed to the funcion points to
}
在这种情况下,您可以通过在一次双指针上指示指向
的地址更改指针值。适用于上述答案。- "错误:数组下标的无效类型'float [10001][float]'是什么意思?
- 错误:数组下标的类型"const bool[int]"无效
- Qt并发错误:数组初始化需要大括号括起来的初始值设定项列表
- 使用GCC 4.8构建错误:数组用作初始化器
- 如何修复问题中的"teminated due to timeout"错误 数组操作 |黑客兰克?
- | 9 |错误:非静态数据成员'matrix :: row'| 9 |错误:数组绑定不是在']']'令牌|之前的整数常数
- 错误:数组的总大小不得超过0x7fffffff字节
- 错误:无法将参数“1”的“double*”转换为“double”,错误:数组下标的类型“double[double]”无
- 返回并强制转换数组指针(错误:数组下标的类型..无效)
- 返回c++中的字符错误数组
- VC++错误:数组实例化的大小来自模板化的静态常量
- c++mex错误:数组下标的类型“double[mwSize]”无效
- 错误数组用作初始值设定项,我不知道错误
- 编译错误 - 数组下标'char[int]'的类型无效
- 向量在我的类中.错误:数组new [-fpermissive]中的圆括号初始化项
- 错误:数组下标的类型无效
- 错误:数组new中的size必须是整型[-fpermissive]
- 错误:数组下标的“Pixel*[__complex__ int]”类型无效
- c++错误数组显示
- C++:错误:数组下标的类型“size_t{aka long unsigned int}[size_t{aka long