2011-05-03 64 views
7

Possible Duplicate:
Returning local data from functions in C and C++ via pointer返回整数数组从功能不带参数

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

我得到的错误:“警告:函数返回局部变量的地址”

我的代码已被简化的阅读

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

导致我明白,当函数结束的足尖,易于r丢失了,但阵列仍然会被发送?如果没有,在函数调用中返回没有参数的整型数组有什么好方法?

欣赏的帮助提前!

干杯

+1

请注意,[数组和指针是不一样](http://stackoverflow.com/questions/1641957/is-array-name-a-pointer-in-c)。另请参见:[如何在C++中使用数组?](http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c)。 – sbi 2011-05-03 08:30:35

回答

4

I am led understand that when the function ends the pointer is lost, but will the array still be sent?

行为是不确定的。

what is a good way to return this integer array with no arguments in the function call?

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. 
+0

'-1',用于将裸体指针中的“新”对象存储起来。 – sbi 2011-05-03 08:31:31

+0

@sbi - 请您详细说明您的评论,以便我可以更正。 – Mahesh 2011-05-03 08:34:17

+1

@Mahesh:在这些情况下,您可以使用诸如boost :: shared_array这样的智能指针来代替手动内存管理。 – Naveen 2011-05-03 08:36:41

1

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

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

现在nums是一个指向堆阵列将后getNums回报生活。

7

没有,阵列将不会被“派”。你需要做的其中之一:

  • 创建磁盘阵列使用动态新
  • 创建数组静态
  • 数组到函数传递为指针
  • 使用std ::矢量

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

+2

'std :: vector'的'+ 1'。 (尽管你可能想添加'std/boost :: array'。) – sbi 2011-05-03 08:27:39

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

应该propabally现在的工作:)

+0

使静态增加它的生命周期并完成:) – 2011-05-03 08:26:24

+0

希望你的应用程序的单线程! – ildjarn 2011-05-03 08:32:11

+0

OP可能并不明显,这就像是一个全局变量。即使使用单个线程,也可以通过“创建”两个阵列并将其中一个变化反映在另一个中,从而很容易被烧毁。 – zoul 2011-05-03 08:43:19

2

每当一个函数退出所有函数中创建的局部变量得到丢弃。
你正在创建一个阵列的本地的函数,然后返回一个指向数组的指针。返回的指针将指向已被OS回收的内存位置。所以它不会为你工作。
而不是阵列,你应该使用向量,因为它是C++

0

你的数组是一个常规的基于堆栈的局部变量。这意味着当你从函数返回并返回一个指针不起作用时它就会消失。你必须使数组活得更长,可以通过把它变成一个静态变量或在堆中分配不能做到:

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

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

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

而且,正如其他人所指出的,如果您不坚持使用普通的C数组,那么还有更好的特定于C++的解决方案。

+0

在裸指针中存储一个'new''d对象是一个坏主意,你的警告不足以弥补这一点。 – sbi 2011-05-03 08:32:35

+0

对不起,我从一个C解决方案开始,比注意到C++标签并冒险进入一个未知领域。我会回到我熟悉的普通C例子:)谢谢你的纠正,在这种情况下究竟会出现什么问题? – zoul 2011-05-03 08:36:05

+0

如果你得到一个函数的裸指针,你不知道是否需要释放它指向的任何东西,如果你知道,你不知道如何。 (它是一个对象还是一个数组?它是'new'd还是'malloc''d?)每当你用一个指向资源的哑指针来进行清理时,你都不是异常安全的。为此,您应该使用智能指针,最好是现成的指针,比如'std :: vector'或'std :: shared_array'。 – sbi 2011-05-03 11:28:39

5

假装你不知道什么是C-阵列,并加入现代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

如果'std/tr1/boost :: array'不可用,那么你可以返回一个包含数组的结构;这可能比'std :: vector'更有效率,特别是对于小型数组。 – 2011-05-03 10:51:48