为什么我的数组double函数不起作用?

时间:2018-10-20 01:51:38

标签: c++

我尝试制作一个函数,该函数将传递给它的数组加倍,只有一个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;
}

4 个答案:

答案 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;
} 

Live Example

()将自动将条目设置为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 << " ";
}

Live Example

答案 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