C++ 将一个数组的内容复制到另一个数组时出现问题…获取奇怪的数字

C++ 将一个数组的内容复制到另一个数组时出现问题…获取奇怪的数字,c++,arrays,dynamic-allocation,C++,Arrays,Dynamic Allocation,我的程序从一个动态分配(DA)数组开始。然后提示用户输入尺寸。如果输入的大小在某个阈值内,将创建一个新的DA数组,将旧数组的内容复制到新数组中,然后显示新数组 我无法将内容从一个动态DA数组复制到另一个动态分配的数组。在重新分配过程的每个步骤中,我都有“打印测试”,在每个过程之后显示阵列。我测试了初始化和复制 请参阅下面的代码。具体来说,如果我输入27、28、29或70,我会得到一堆看起来像内存地址的奇怪数字……我不知道我做错了什么 我不能使用向量 编辑:天哪,非常感谢你指出了我的错误…把我弄糊

我的程序从一个动态分配(DA)数组开始。然后提示用户输入尺寸。如果输入的大小在某个阈值内,将创建一个新的DA数组,将旧数组的内容复制到新数组中,然后显示新数组

我无法将内容从一个动态DA数组复制到另一个动态分配的数组。在重新分配过程的每个步骤中,我都有“打印测试”,在每个过程之后显示阵列。我测试了初始化和复制

请参阅下面的代码。具体来说,如果我输入27、28、29或70,我会得到一堆看起来像内存地址的奇怪数字……我不知道我做错了什么

我不能使用向量

编辑:天哪,非常感谢你指出了我的错误…把我弄糊涂了。再次感谢大家

#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;
        }
    }

}
#包括
使用名称空间std;
int main(){
int maxSize=25;
int active_size=0;
int*uaptr;
uaptr=新整数[maxSize];
对于(int i=0;i活动大小;
cin.clear();
cin.ignore(1000,10);
如果(活动大小>(0.8*maxSize)){
最大尺寸*=4;
int*tempPtr;
tempPtr=新整数[maxSize];

对于(int i=0;i您的问题可能是未定义的行为,因为
active\u size
是从用户输入读取的,但与数组的实际大小无关。因此

for (int i=0; i<active_size; i++)  //Copy contents of old array into new,bigger array
    *(tempPtr + i) = *(uaptr + i); 

它与
active\u size
无关。因此,如果您输入的
active\u size
大于25(您的
uaptr
数组的大小)您读取的内存超出了
uaptr
的限制,这是一种未定义的行为。

您在新的、更大的数组大小中一路循环。但是旧数组没有那么大。因此,当您超过原始数组的大小时,会得到一堆垃圾值。请看这里:

for (int i=0; i<active_size; i++) 
    *(tempPtr + i) = *(uaptr + i);

您的代码包含逻辑错误。例如,虽然您已分配了25个maxSize元素的错误,但初始活动大小id等于0。 当您在实际大小中输入一个新值,该值可以大于最大大小。然后,您使用这个新的实际大小值将元素从旧数组复制到新数组中,但是旧数组的元素可以少于输入的实际大小值。因此

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?!?!

您也可以使用标准算法进行这些操作。例如,假设当前数组的大小是old_length。然后您可以编写

std::fill( std::copy( uaptr, uaptr + old_length, tempPtr ), tempPtr + maxSize, 0 );

tempPtr的大小为100不可能为25,这取决于输入。但uaptr的大小为25。您写道:“但tempPtr只是maxSize开始时的大小,即25”。@Itsik谢谢,错了。
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?!?!
tempPtr = new int [maxSize] {};
tempPtr = new int [maxSize]();
std::fill( std::copy( uaptr, uaptr + old_length, tempPtr ), tempPtr + maxSize, 0 );