将一个数组的内容复制到另一个数组时出现问题..得到奇怪的数字
Trouble copying contents of an array into another array...getting weird numbers
我的程序从一个动态分配的(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;
}
}
}
您正在通过新的、更大的数组大小一路循环。但是旧的阵列并没有那么大。因此,当您超过原始数组的大小时,您将获得一堆垃圾值。看这里:
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);
您的问题可能是未定义的行为,因为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
无关.因此,如果您输入大于 25(uaptr
数组大小)的active_size
,则读取的内存超出了uaptr
的限制,这是未定义的行为。
您的代码包含逻辑错误。例如,最初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?!?!
具有未定义的行为。它可以尝试访问旧阵列以外的内存。
您应该使用一些变量来存储当前数组的元素数量。您也可以使用运算符 new 初始化一个带有零的新分配数组。例如
tempPtr = new int [maxSize] {};
或
tempPtr = new int [maxSize]();
您还可以为这些操作使用标准算法。例如,假设当前数组的大小为 old_length。然后你可以写
std::fill( std::copy( uaptr, uaptr + old_length, tempPtr ), tempPtr + maxSize, 0 );
- 数组C++问题中最大和第二大的数字
- 二维数组问题
- 数组问题:变量周围的堆栈'arr'已损坏
- 无符号字符数组问题
- 数组问题(if (zeds[i].x == zeds[i].x))
- 字符数组问题
- C++中的turbo数组问题
- 输入和输出的2D字符数组问题
- 多维数组问题
- 指针和数组指向数组问题
- 如何随机排列数组问题
- C++ 多维数组问题 - 多次打印条目
- C++ 2D 读入数组问题
- C++读入 2D 数组问题
- 指针和多维数组问题
- C++多项式类,指针数组问题
- 在数组问题(C++)中查找偶数
- 二维std::数组问题
- 向量/数组问题,不能给变量赋索引/不能使用变量作为数组大小(索引)c++
- 指针数组问题