内存位置作为放大动态数组中的最后一个值[重复]

Posted

技术标签:

【中文标题】内存位置作为放大动态数组中的最后一个值[重复]【英文标题】:Memory Location as last value in enlarged dynamic array [duplicate] 【发布时间】:2017-03-09 13:48:41 【问题描述】:

我将一个动态数组传递给一个函数,该函数的值是要添加到数组中的,当我动态放大和重置数组并遍历数组时,我发现数组的最后一个值是垃圾值而不是预期的。我查看了关于 SO 的其他一些帖子以及一些文档,但我对自己做错了什么感到困惑。 我更喜欢使用向量,但不幸的是我的任务需要一个动态数组。有什么想法吗?谢谢。

上面的帖子是通过引用传递指向向量的指针,与扩大动态数组无关

主要

cout << "Please enter the size of the array of integers you would like to create: ";
    cin >> size;

    cout << "\nPlease enter your integers:\n";

    int *integerArray = new int[size];

    //store values in array
    for (int dynamicArrayDataCounter = 0; dynamicArrayDataCounter < size; dynamicArrayDataCounter++)
        cin >> integerArray[dynamicArrayDataCounter];

    cout << "\n Please enter the integer you would like to insert into this array: ";
    cin >> userInt;

    InsertIntegerToSortedList(integerArray, userInt, size);

    //Print array for proof
    for (int counterPrinter = 0; counterPrinter < size + 1; counterPrinter++)
        cout << endl << integerArray[counterPrinter];

    //Remove memory and repoint dangling pointer
    delete [] integerArray;
    integerArray = NULL;

    return 0;

功能

void InsertIntegerToSortedList(int *integerArray, int userInteger, int size)

    //Declare new array to add index position for integerArray
    int *resizedArray = new int[size + 1];
    bool numInserted = false;

    for (int counter = 0; counter < size + 1; counter++)
    
        if (integerArray[counter] < userInteger)
        
            resizedArray[counter] = integerArray[counter];
        
        else if ((integerArray[counter] > userInteger && integerArray[counter - 1] < userInteger) || integerArray[counter] == userInteger || (integerArray[counter] <= userInteger && size - counter == 1))
        
            resizedArray[counter] = userInteger;

            numInserted = true;
        
        else if (numInserted)
            resizedArray[counter] = integerArray[counter - 1];
    

    //Store resizedArray values in integerArray
    integerArray = resizedArray;

    //Remove dynamic array on heap and repoint dangling pointer
    delete[] resizedArray;
    resizedArray = NULL;

【问题讨论】:

【参考方案1】:

void InsertIntegerToSortedList(int *integerArray, int userInteger, int size)

您通过值传递指针integerArray,因此在函数退出时您最终不会修改它。通过引用传递它,比如

void InsertIntegerToSortedList(int* & integerArray, int userInteger, int size)

此外,正如 cmets 中所述,您做的有点不对。首先,将数组元素复制到resizedArray。接下来,需要删除旧数组,

delete[] integerArray;

最后将新分配的数组赋值给integerArray

integerArray = resizedArray;

这就是我们所需要的,现在integerArray 将指向通过resizedArray 分配的内存。无需将resizedArray 设置为NULL,它只是一个局部变量,在函数退出时将不复存在。您关心的只是您分配的内存的地址,并且您已经将其存储到 integerArray 指针中。

【讨论】:

我以为数组总是通过引用传递的? 这是一个指针不是数组。 另外,当我进行更正时,当我尝试打印数组时,我得到所有垃圾值,而不是最后一个垃圾值 您在函数退出前释放了分配给resizedArray 的内存。您应该为原始数组释放内存。 @drescherjm 是的,但是我设置了 integerArray = resized array...我不允许事先释放内存吗?

以上是关于内存位置作为放大动态数组中的最后一个值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何释放动态结构数组的内存

【python】求数组中两个元素的最小距离?

C ++中的动态长度数组[重复]

C语言中的动态内存分配的用法举例

传递动态大小的数组(不允许使用参数)[重复]

二维数组动态内存分配崩溃[重复]