使用指针C ++返回一个数组

时间:2014-04-15 03:29:03

标签: c++ arrays pointers

我试图创建一个以数组作为参数的函数,并创建一个大1个元素的新数组,并使新数组的下一个元素成为第一个数组当前元素(数组1 {1,2,3,4 ,5}数组将成为{0,1,2,3,4,5}),我得到的部分工作正常,但然后该函数必须返回指向新数组的指针并显示该数组。香港专业教育学院一直在玩指针,我可以使用普通的int变量,但没有这个数组,它一直显示垃圾。谁知道我做错了什么?

#include "stdafx.h"
#include <iostream>

using namespace std;

int *newaray(int[], int);

int main()
{
    int *numbers;
    int i;
    int ar1[] = {1,2,3,4,5};

    numbers = newaray(ar1, 5);

    for (i = 0; i <= 5; i++)
    {
        cout << numbers[i] << endl;
    }
    //cout << numbers << endl;

    system("pause");
    return 0;
}

int *newaray ( int array[],int size)
{
    int ar2[] = {0,0,0,0,0,0};
    int i;
    int *ptr;

    ptr = ar2;

    for ( i = 0; i <= size; i ++) 
    {
        ar2[i + 1] = array[i];
    }

    //for (i = 0; i <= size; i++)
    //{
    //  cout << ar2[i] << endl;
    //}
    return ptr;

}

6 个答案:

答案 0 :(得分:2)

您需要使用动态内存分配,否则当函数堆栈弹出时您的阵列会消失。当然,在完成之后请记住delete,这样就不会泄漏内存。

#include <iostream>
#include <string.h>

using namespace std;

int *newaray(int[], int);

int main()
{
    int *numbers;
    int i;
    int ar1[] = {1,2,3,4,5};

    numbers = newaray(ar1, 5);

    for (i = 0; i < 6; i++)
        cout << numbers[i] << endl;

    // Clean up after ourselves.
    delete[] numbers;

    return 0;
}

int *newaray ( int array[],int size)
{
    // Allocate new memory on the heap to store the return value.
    int *ar2 = new int[size + 1];
    memset(ar2, 0, (size +1)*sizeof(int));

    for (int i = 0; i < size; i++) 
        ar2[i + 1] = array[i];

    return ar2;
}

答案 1 :(得分:2)

您必须使用new运算符动态分配数组。

请参阅下面的代码。

int *newaray ( int array[], int size)
{
    int i;
    int *ar2=new int[size+1]; // note size+1
    ar2[0]=0;

    for ( i = 0; i < size; i ++) // no equal to operator
    {
        ar2[i + 1] = array[i];
    }

    return ar2;

}

在main中,释放为数组分配的内存:

    delete[] numbers;
    return 0;
}

答案 2 :(得分:2)

你的函数返回int *是不好的风格。这是因为它让调用者有责任担心内存管理。

最好将数组放在管理自己内存的容器中。幸运的是,在标准C ++中有很多这样的容器,最简单的是std::vector,它可以容纳一个可变大小的数组。 (还有std::array,但只有在编译时知道大小时才有效。

std::vector<int> new_array( int array[], int size )
{
    std::vector<int> vec( array, array + size );
    vec.insert( vec.begin(), 0 );
    return vec;
}

然后在main

std::vector<int> numbers = new_array(arr1, 5);

for (i = 0; i < numbers.size(); i++)
    cout << numbers[i] << endl;

这个代码几乎等同于其他海报建议的“引擎盖”,除了在这个版本中你不必担心内存管理及其相关问题。

答案 3 :(得分:1)

数组在堆栈上,一旦函数返回就超出范围。您要返回的指针无效。

在您的上下文中(尝试创建新数组),您可能需要动态分配数组(并记住在完成数组后删除它们)

答案 4 :(得分:1)

您正在返回指向从函数返回时被删除的数组的指针。 main中的指针指向已删除的内存,因此您会看到垃圾。您需要从堆中分配内存并返回指针从堆中分配的内存。

int *newaray ( int array[],int size)
{
   int* ptr = new int[size+1];
   for ( int i = 0; i <= size; i ++) 
   {
       ptr[i + 1] = array[i];
   }
   return ptr;
}

main中,请确保取消分配内存。

numbers = newaray(ar1, 5);

for (i = 0; i <= 5; i++)
{
    cout << numbers[i] << endl;
}
delete [] numbers;

答案 5 :(得分:1)

这是一个使用更多C ++概念的奖金版本(需要C ++ 11)。 IMO这种任务比学习输入解析更适合学习语言。

#include <vector>
#include <iostream>

template<typename T, size_t size> 
std::vector<T> new_array(T (&array)[size] )
{
    std::vector<T> vec( array, array + size );
    vec.insert( vec.begin(), T() );
    return vec;
}

int main()
{
    int ar1[] = { 1, 2, 3, 4, 5 };

    auto numbers = new_array(ar1);

    for ( auto num : numbers )
        std::cout << num << std::endl;
}

在此版本中,您可以使用int ar1[]double或任何std::string数组替换class,其他所有内容都保持不变!