我是一名新编程学生。我目前正在研究指针和动态数组。我需要帮助的赋值让我创建一个数组然后使用一个函数来加倍元素并将数组的后半部分初始化为零。这是我的代码:
#include <iostream>
using namespace std;
// Function prototype
void doubleArray(int*, int);
// Global variable for array elements
int numElems = 5;
int main()
{
int* oldArray; // Array variable
oldArray = new int[numElems]{1, 3, 5, 7, 9}; // Makes the array dynamic
// Display old array
cout << "This is the old array.\n";
for (int a = 0; a < numElems; a++)
{
cout << oldArray[a] << endl;
}
// Double the array size, copy old array into new array, and initialize the rest of the space to zero
doubleArray(oldArray, numElems);
cout << endl;
delete[] oldArray;
oldArray = nullptr;
return 0;
}
// Function doubles array size, copies old array into new array, and initializes the rest of the space to zero
void doubleArray(int* newArray, int size)
{
size *= 2;
for (int b = 5; b < (size/2); b++)
{
newArray[b] = {0};
}
cout << "This is the new array.\n";
for (int c = 0; c < size; c++)
{
cout << newArray[c] << endl;
}
}
这是输出: 这是旧阵列。 1 3 五 7 9 这是新阵列。 1 3 五 7 9 0 138433 0 0 0
正如您所看到的,当函数doubleArray第二次运行循环时,第二个'for'循环中存在垃圾。我一直在论坛上努力寻找答案,但还没有成功。
答案 0 :(得分:1)
您为内存分配的数组仅适用于5个整数,当您尝试增加元素数量时,必须为数组分配更多内存。
你应该做的是为一个大小加倍的数组分配内存,复制初始数组的内容,然后将另一半元素分配为0.
然后返回新数组的引用,或者你可以创建旧数组&#34; point&#34;到新参考
答案 1 :(得分:0)
在doubleArray
中没有任何地方将数组加倍。相反,你开始踩踏旧数组周围的数据。这不是一个好主意。你不知道那里有什么。可能是重要的事情。可能会破坏你的程序。在过去,它可能会破坏计算机或在另一个程序中粉碎一些重要信息。也许是某人的银行账户。也许有关飞机飞行位置的说明。不好。
要解决此问题,您需要new[]
自己另一个int
的数组,其大小是原始数据的两倍。不要将该变量重用于旧数组。如果你在上面写,你会丢失旧的数组。您仍然需要将旧数组中的旧数据转换为新数组,如果您不将旧数组正确放置you will leak memory。
完成后,直到下一位:保留旧数据并将新数组的其余部分归零。为此,将旧数组中的所有数据复制到新数组(for
循环非常适合此作业)并用零填充新数组的其余部分。
接下来一些家务。由于不再需要旧数组,因此可以安全delete[]
来防止内存泄漏。
最后将新数组返回给调用者。
如果你感到勇敢,请向你的导师指出,这个名为std::vector的非常酷的东西是在20世纪90年代发明的,并且基本上完成了所有这些(并且很多)更多!)为你。