gpt4 book ai didi

c++ - 传递给调整大小函数后使用 new 创建的动态数组出错

转载 作者:行者123 更新时间:2023-11-30 04:46:20 25 4
gpt4 key购买 nike

我正在尝试使用 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()函数然后到ResizeDynamicArray()仅当capacity <= size ,但是传递给第一个函数的数组传递了良好的值,但数组中的指针异常。

示例:

对于 3 个数组,我有:

array[0] = 1 --> 包含值 1 的地址 0x0004e300

array[1] = 2 --> 地址 0x00000003 包含 ???

array[2] = 3 --> 地址 0x008ffb24 包含值 2

我真的不明白,如果有人能解释我的错误就太好了:/。

最佳答案

问题就在这里

void InsertElement (int *dynamicArray, int element, int &size, int capacity)
{
if (capacity <= size)
{
ResizeDynamicArray (&dynamicArray, size+1);
}
dynamicArray[size] = element;
size++;
}

当您调用 ResizeDynamicArray 时你正在改变 dynamicArray声明为 InsertElement 参数的指针.您没有更改 oPtrDynamicArray main 中的指针。

如果你想完成这项工作,你需要更改 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;
}

您不是第一个无法理解指针的新手。仔细查看上面的代码并将其与您的代码进行比较。主要区别在于我的代码使用指针来更改指向的内容。您的代码试图更改指针本身,这是不正确的。这很令人困惑,因为指向的是另一个指针(动态数组)。

关于c++ - 传递给调整大小函数后使用 new 创建的动态数组出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56827657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com