我尝试制作一个函数,该函数将传递给它的数组加倍,只有一个for循环,并将int 0添加到每个没有先前值的额外索引。
我发现最后3个元素最终被打印为内存地址。
为什么这不起作用,我该如何解决?
示例:
int array[] = { 3,5,6 };
int size = 3;
arrayDouble(array,size)
int array[] = { 3,5,6,0,0,0 }; //expected output
#include "pch.h"
#include <iostream>
#include <string>
using namespace std;
int * arrayDouble(int array[], int size);
int main()
{
int array[] = { 3,5,6 };
int size = 3;
int * ptrarray = arrayDouble(array, size);
}
int * arrayDouble(int array[], int size)
{
int *new_array = new int[size * 2];
for (int i = 1; i <= size * 2; i++)
{
if (i > (size * 2))
{
new_array[i - 1] = 0;
}
new_array[i - 1] = array[i - 1];
}
for (int i = 0; i < size * 2; i++)
{
cout << new_array[i];
}
return new_array;
}
答案 0 :(得分:1)
其他人指出了循环问题。但是,如果在使用new[]
时默认初始化条目,则不需要两个循环。
此外,如果使用std::copy
将数据从一个数组复制到另一个数组,甚至不需要循环。
示例:
int* arrayDouble(int array[], int size)
{
int *new_array = new int[size * 2](); // <-- Note the () to value-initialize the memory
std::copy(array, array + size, new_array); // <-- Use copy to copy over the values to new_array
// print results
for (int i = 0; i < size * 2; i++)
std::cout << new_array[i] << " ";
return new_array;
}
()
将自动将条目设置为double
的默认值,即0。
对于C ++ 11,您还可以使用括号初始化程序:
int *new_array = new int[size * 2]{};
但是,当已经有std::vector
已经完成所有这些工作并且没有潜在的内存泄漏问题时,为什么要这样做呢?
#include <iostream>
#include <vector>
int main()
{
std::vector<int> array = { 3,5,6 };
array.resize(array.size() * 2);
for (auto v : array)
std::cout << v << " ";
}
答案 1 :(得分:0)
本节
for (int i = 1; i <= size * 2; i++)
{
if (i > (size * 2)) // this never evaluates to true?
{
new_array[i - 1] = 0;
}
new_array[i - 1] = array[i - 1]; // this always happens
}
应该是
for (int i = 0; i < size * 2; i++)
{
if (i > size)
{
new_array[i] = 0;
}else{
new_array[i] = array[i];
}
}
此外,如果不管理要创建的所有这些阵列,则可能会遇到内存泄漏。
答案 2 :(得分:0)
您的for循环很奇怪
for (int i = 1; i <= size * 2; i++)
{
if (i > (size * 2))
{
new_array[i - 1] = 0;
}
new_array[i - 1] = array[i - 1];
}
应该看起来像这样
for (int i = 0; i < size * 2; i++) //easier to understand if you just start with 0
{
if (i > size) //you don't need to multiply by 2!!
{
new_array[i] = 0;
}
new_array[i] = array[i];
}
那应该为您解决
答案 3 :(得分:-2)
我搞砸了。我没看到尺寸* 2