从没有参数的函数返回整数数组

时间:2011-05-03 08:21:23

标签: c++ arrays function pointers return

  

可能重复:
  Returning local data from functions in C and C++ via pointer

我需要创建一个没有返回数组的参数的函数

我收到错误:“warning:function返回局部变量的地址”

我的代码已经过简化以便于阅读

int * getNums()
{
    int nums[8];
    nums = {1,2,3,4,5,6,7,8};
    return nums;
}

我被领导了解当函数结束时指针丢失,但数组是否仍会被发送?如果没有,在函数调用中返回没有参数的整数数组的好方法是什么?

提前感谢帮助!

干杯

7 个答案:

答案 0 :(得分:7)

不,数组不会被“发送”。您需要执行以下操作之一:

  • 使用新的
  • 动态创建数组
  • 静态创建数组
  • 将数组作为指针传递给函数
  • 使用std :: vector

在大多数情况下,最后一个是首选解决方案。

答案 1 :(得分:5)

假装您不知道C-arrays是什么,并加入现代 C ++ 的世界:

#include <array>
std::array<int, 8> getNums()
{
    std::array<int, 8> ret = {{ 1, 2, 3, 4, 5, 6, 7, 8 }};
    return ret;
}

如果您的编译器太旧而无法提供std::std::tr1:: array<>的实现,请考虑使用boost::array<>。或者,考虑使用std::vector<>两种方式。

答案 2 :(得分:3)

  

我被领导了解当函数结束时指针丢失,但数组是否仍会被发送?

行为未定义。

  

在函数调用中返回没有参数的整数数组的好方法是什么?

int nums[8];

num是驻留在堆栈上的局部变量。您不能返回局部变量的引用。而是使用运算符nums分配new并记住delete[]

int* getNums()
{
     int *nums = new int[8] ;
     // .....

     return nums ;
}

// You should deallocate the resources nums acquired through delete[] later,
// else memory leak prevails.

答案 3 :(得分:2)

每当函数退出时,在该函数中创建的所有局部变量都会被删除 您正在创建函数本地的数组,然后返回指向该数组的指针。返回的指针将指向已由OS回收的内存位置。所以它不适合你。
你应该使用向量而不是数组,因为它是C ++

答案 4 :(得分:1)

你不能在C ++中返回一个简单的数组。尝试

int *getNums()
{
    int *nums = new int[8];
    ...
    return nums;
}

现在nums是一个指向堆数组的指针,它将在getNums返回后继续存在。

答案 5 :(得分:0)

int* getNums()
{
    static int nums[8];
    nums = {1,2,3,4,5,6,7,8};
    return nums;
}

它应该现在可以正常工作:)

答案 6 :(得分:0)

您的数组是基于堆栈的常规局部变量。这意味着它从函数返回时会消失并返回指向它的指针不起作用。你必须让数组更长寿,这可以通过将其转换为静态变量或在堆上分配来完成:

int *getArray {
    static int foo[] = {…};
    return foo;
}

int *getArray {
    int foo[] = calloc(numberOfItems, sizeof(int));
    foo = …;
    return foo;
}

在使用之前,您应该了解这两种解决方案。也就是说,静态分配(第一选项)主要是现在的好奇心,因为它创建了一种全局变量并导致比它解决的问题更多的问题。堆分配的数组很常见,但更常见的是使用参数传递指针以使接口更明确。在每种情况下,调用者都有责任在以后释放分配的内存。

而且,正如其他人所说,如果你不坚持使用普通的C数组,那么甚至还有更好的C ++解决方案。