无法将数组的内容复制到另一个数组中......得到奇怪的数字
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++ 等语言将数组的内容复制到另一个数组吗?