通过新的后传递后创建的动态数组的错误以调整函数

Errors with dynamic Array created with new after passed to resize function

本文关键字:错误 数组 函数 动态 调整 创建      更新时间:2023-10-16

我正在尝试使用我要调整大小的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时,您将更改为InsertElementdynamicArray指针。您是不是更改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
}

在这种情况下,您可以通过在一次双指针上指示指向

的地址更改指针值。适用于上述答案。