为啥从函数返回数组作为参数时,我会从函数中的数组中获取随机值? [复制]
Posted
技术标签:
【中文标题】为啥从函数返回数组作为参数时,我会从函数中的数组中获取随机值? [复制]【英文标题】:Why I am getting random values from array in a function when returning an array from a function as an argument? [duplicate]为什么从函数返回数组作为参数时,我会从函数中的数组中获取随机值? [复制] 【发布时间】:2016-10-15 07:21:49 【问题描述】:我想在另一个函数的函数中通过引用传递一个数组。下面是我的代码
// Objectives:
// 1. Passing an array to a method
// 2. Returning arrays from a method
#include <iostream>
using namespace std;
int getArray(int* arr)
for (int i=0; i< 11; i++)
cout << arr[i] << endl;
return 0;
int* returnArray()
int arr [11] = 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21;
return arr;
int main()
getArray(returnArray());
return 0;
这是我的输出:
get_return_array.cpp:17:12: warning: address of stack memory associated with local variable 'arr' returned
[-Wreturn-stack-address]
return arr;
^~~
1 warning generated.
1
32767
170167402
1
9
11
2051556088
32767
17
9
1436251616
为什么数组的值是一些垃圾值,警告表示什么?
标记为重复,为什么??:我已经展示了static
的用法并附有解释,而其他人的答案没有。
【问题讨论】:
是为了某种社区维基吗?忽略显式警告有什么意义? 不,您没有通过引用传递数组。 您没有将 get 函数传递给您的数组,您只是将指针传递给您的数组的第一个元素 【参考方案1】:C++ 不提倡将本地数组的引用传递给外部函数。 arr
的生命周期是直到它的父函数运行。如果完成任何新的赋值,arr
堆栈中的值将被覆盖。
所以为了克服这个限制,我们必须使用static
,其目的是静态分配值,使其生命周期延长到程序运行。
这就是数组有一些垃圾值的原因。
正确的程序将是
#include <iostream>
using namespace std;
int getArray(int* arr)
for (int i=0; i< 11; i++)
cout << arr[i] << endl;
return 0;
int* returnArray()
static int arr [11] = 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21;
return arr;
int main()
getArray(returnArray());
return 0;
对应的输出是:
1
3
5
7
9
11
13
15
17
19
21
干杯
【讨论】:
重要的是函数的 API 明确地告诉例如数组不能在线程之间共享。它不是线程安全的或可重入的。如果您标记此问题 C++ 的正确方法是返回vector
,那么您就不必担心分配/解除分配。
@Jean-FrançoisFabre 我的示例中没有使用线程。以上是关于为啥从函数返回数组作为参数时,我会从函数中的数组中获取随机值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
创建函数-----------(向函数传递数组从函数返回数组)