无法将数组的内容复制到另一个数组中......得到奇怪的数字

Posted

技术标签:

【中文标题】无法将数组的内容复制到另一个数组中......得到奇怪的数字【英文标题】:Trouble copying contents of an array into another array...getting weird numbers 【发布时间】:2014-03-22 05:30:56 【问题描述】:

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


【问题讨论】:

【参考方案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);

【讨论】:

tempPtr 的大小为 100 而不是 25 可能,取决于输入。但 uaptr 的大小为 25。 你写道:'但是 tempPtr 只是 maxSize 开始时的大小,即 25。' @Itsik 谢谢,错误。【参考方案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 限制的内存,这是未定义的行为。

【讨论】:

【参考方案3】:

您的代码包含逻辑错误。例如,最初 active_size id 等于 0,尽管您已经分配了 maxSize 个元素的错误,即 25 个元素。 当您在可能大于 max_size 的 actual_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 );

【讨论】:

以上是关于无法将数组的内容复制到另一个数组中......得到奇怪的数字的主要内容,如果未能解决你的问题,请参考以下文章

如何将一个二维数组中的内容复制到另一个二维数组

C:试图将指针值复制到另一个指针中,得到可修改的左值错误

我们可以用 C# 和 C++ 等语言将数组的内容复制到另一个数组吗?

如何在 C# 中将数组的一部分复制到另一个数组?

在javascript中将对象数组复制到另一个数组中(深度复制)

如何将 Php 数组变量的值复制到另一个数组