内存位置作为放大动态数组中的最后一个值[重复]
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...我不允许事先释放内存吗?以上是关于内存位置作为放大动态数组中的最后一个值[重复]的主要内容,如果未能解决你的问题,请参考以下文章