为啥从函数返回数组作为参数时,我会从函数中的数组中获取随机值? [复制]

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 我的示例中没有使用线程。

以上是关于为啥从函数返回数组作为参数时,我会从函数中的数组中获取随机值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C语言中,数组名作为函数参数,属于啥传递,为啥?

从函数中的 void * 参数返回数组

数组名作为函数的参数属于啥传递为啥

创建函数-----------(向函数传递数组从函数返回数组)

Javascript - 为啥从函数返回 array.push(x) 不会将元素 x 推送到数组中?

带有数组的函数不起作用