我的程序以动态分配的(DA)数组开始。然后它会提示用户输入大小。如果输入的大小在特定阈值内,则创建一个新的DA数组,将旧的内容复制到新的数组中,然后显示新的数组。
我无法将内容从一个动态DA数组复制到另一个动态分配的数组中。通过重新分配过程的每个步骤,我都有“打印测试”,在每个过程之后显示数组。我测试初始化和复制。
请参阅下面的代码。具体来说,如果我输入27,28,29或70,我会得到一堆看起来像内存地址的怪异数字....我无法弄清楚我做错了什么。
我不能使用载体。
编辑:omg非常感谢你指出我的错误...让我感到困惑。再次感谢大家!!!
#include <iostream>
using namespace std;
int main () {
int maxSize = 25;
int active_size = 0;
int *uaptr;
uaptr = new int [maxSize];
for (int i=0; i<maxSize; i++)
*(uaptr + i) = 1;
cout << "\nWhat size you would like the array to be?: ";
cin >> active_size;
cin.clear();
cin.ignore (1000, 10);
if (active_size > (0.8 * maxSize)) {
maxSize *= 4;
int *tempPtr;
tempPtr = new int [maxSize];
for (int i=0; i<maxSize; i++)
*(tempPtr + i) = 0;
cout << "Testing initialization..." << endl;
for (int i=0; i<maxSize; i++) { //TEST INITIALIZATION
cout << *(tempPtr + i) << " ";
if ((i+1)%10==0)
cout << endl;
}
for (int i=0; i<active_size; i++) //Copy contents of old array into new,bigger array
*(tempPtr + i) = *(uaptr + i); //*****What is wrong here?!?!
cout << endl;
cout << "Testing the copying..." << endl;
for (int i=0; i<maxSize; i++) { //TEST COPYING -weird results when numbers 27, 28, 29 or 70 are entered
cout << *(tempPtr + i) << " ";
if ((i+1)%10==0)
cout << endl;
}
delete [] uaptr; //release old allocated memory
uaptr = tempPtr; //update the pointer to point to the newly allocated array
cout << endl;
for (int i = 0; i < active_size; i++) {
cout << *(uaptr + i) << " ";
if ((i + 1) % 10 == 0)
cout << endl;
}
}
}
答案 0 :(得分:1)
您的问题可能是未定义的行为,因为active_size
是从用户输入读入的,但与数组的实际大小无关。因此这里
for (int i=0; i<active_size; i++) //Copy contents of old array into new,bigger array
*(tempPtr + i) = *(uaptr + i);
因为您将它用作索引限制,所以您可以非常轻松地读取和写入超出一个或两个数组的范围。
此处指定的tempPtr
大小
if (active_size > (0.8 * maxSize)) {
maxSize *= 4;
int *tempPtr;
tempPtr = new int [maxSize];
与active_size
无关。因此,如果您输入active_size
大于25(uaptr
数组的大小),那么您正在读取超出uaptr
限制的内存,这是未定义的行为。
答案 1 :(得分:1)
尽管新的更大的数组大小,你仍然在循环。但旧阵列并不是那么大。因此,当您超过原始数组的大小时,您将获得一堆垃圾值。看这里:
for (int i=0; i<active_size; i++)
*(tempPtr + i) = *(uaptr + i);
您一直循环到新大小active_size
的末尾。但是uaptr
只是maxSize
在开始时的大小,即25。所以,当您的覆盖率超过25时,您就开始从......谁知道数据中提取数据?
您的复制循环应该只是原始数组的大小,或者在这种情况下为25。您不会将该大小存储在任何位置,因此您需要存储它是一个变量。 old_size
。然后在复制时只循环那么远:
for (int i=0; i<old_size; i++)
*(tempPtr + i) = *(uaptr + i);
答案 2 :(得分:0)
您的代码包含逻辑错误。例如,最初active_size id等于0,尽管您已经分配了25个元素的maxSize元素的错误。 在actual_size中输入可能大于max_size的新值时。然后使用这个新的actual_size值将旧数组中的元素复制到新数组中,但旧数组的元素数少于输入的actual_size值。所以这句话
for (int i=0; i<active_size; i++) //Copy contents of old array into new,bigger array
*(tempPtr + i) = *(uaptr + i); //*****What is wrong here?!?!
有未定义的行为。它可以尝试访问旧数组之外的内存。
您应该使用一些变量来存储当前数组的元素数量。您还可以使用零初始化新分配的数组以及使用opertaor new。例如
tempPtr = new int [maxSize] {};
或
tempPtr = new int [maxSize]();
您也可以使用标准算法进行这些操作。例如,假设当前数组的大小是old_length。然后你可以写
std::fill( std::copy( uaptr, uaptr + old_length, tempPtr ), tempPtr + maxSize, 0 );