麻烦复制数组的内容到另一个数组......越来越怪异号码(Trouble copying conte

2019-10-19 09:49发布

我的程序与动态分配(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;
        }
    }

}

Answer 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);


Answer 2:

你的问题是,因为可能不确定的行为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这是不确定的行为。



Answer 3:

你的代码中包含的逻辑错误。 例如最初active_size ID等于0,虽然你已经分配MAXSIZE元素是25种元素的错误。 当您在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新的初始化以及用零一个新分配的数组。 例如

tempPtr = new int [maxSize] {};

要么

tempPtr = new int [maxSize]();

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

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


文章来源: Trouble copying contents of an array into another array…getting weird numbers