可能重复:
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;
}
我被领导了解当函数结束时指针丢失,但数组是否仍会被发送?如果没有,在函数调用中返回没有参数的整数数组的好方法是什么?
提前感谢帮助!
干杯
答案 0 :(得分:7)
不,数组不会被“发送”。您需要执行以下操作之一:
在大多数情况下,最后一个是首选解决方案。
答案 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 ++解决方案。