返回的局部变量“bestIdx”的 C++ [警告] 地址 [-Wreturn-local-addr] [重复]

C++ [Warning] address of local variable 'bestIdx' returned [-Wreturn-local-addr] [duplicate]

提问人:Lel 提问时间:10/10/2022 最后编辑:Vlad from MoscowLel 更新时间:10/10/2022 访问量:312

问:

我目前正在编写一个返回数组的函数,但它在编译时一直显示返回 [-Wreturn-local-addr] 的局部变量“bestIdx”的 [Warning] 地址。这是什么意思?

下面是我写的函数:

int *findMostPrefered(int toyCnt, int childrenCnt, int prefer[][20], bool toyNum[], bool childrenNum[]){
int max = prefer[0][0], bestIdx[2]={0};
for(int i=(childrenCnt-1); i>=0; i=i-1){
    if(childrenNum[i] == 0){
        for(int j=(toyCnt-1); j>=0; j=j-1){
            if(toyNum[j] == 0){
                if(prefer[i][j] >= max){
                    max = prefer[i][j];
                    bestIdx[0] = i;
                    bestIdx[1] = j;
                }
            }   
        }
    }
}
return bestIdx;
}
C++ 范围 返回值 返回类型 存储持续时间

评论

5赞 Quimby 10/10/2022
它的含义是它所说的 - 你没有返回数组,只是一个指向本地数组的指针,当你退出调用的那一刻,它就会抓住存在。您希望返回 EITHER 或 取决于其大小在编译时是否已知。std::arraystd::vector
2赞 UnholySheep 10/10/2022
甚至可能是一个 - 或一些自定义定义,其中包含您返回的两个值std::pair<int, int>struct
2赞 Ted Lyngmo 10/10/2022
“编写一个返回数组的函数” - 放弃它。不能在 C++ 中返回数组。您只能返回一个元素。它可以包含一个数组。

答:

2赞 Vlad from Moscow 10/10/2022 #1

您声明了具有自动存储持续时间的块作用域数组bestIdx

int max = prefer[0][0], bestIdx[2]={0};

退出函数后将不存活。因此,返回的指向数组第一个元素的指针将无效。取消引用此类指针会调用未定义的行为。

您可以使用该类型的对象并返回它,而不是具有两个元素的数组。例如std::pair<int, int>

#include <utility>

//...

std::pair<int, int> findMostPrefered(int toyCnt, int childrenCnt, int prefer[][20], bool toyNum[], bool childrenNum[]){
int max = prefer[0][0];
std::pair<int, int> bestIdx( 0, 0 );
for(int i=(childrenCnt-1); i>=0; i=i-1){
    if(childrenNum[i] == 0){
        for(int j=(toyCnt-1); j>=0; j=j-1){
            if(toyNum[j] == 0){
                if(prefer[i][j] >= max){
                    max = prefer[i][j];
                    bestIdx.first = i;
                    bestIdx.second = j;
                }
            }   
        }
    }
}
return bestIdx;
}

评论

0赞 Lel 10/10/2022
谢谢大家的回复!要问莫斯科@Vlad一个小问题,如何在主函数中调用该函数?
0赞 Vlad from Moscow 10/10/2022
@Lel 你可以写例如std::p air<int, int> mostPrefered = findMostPrefered( /* 必填参数 / ); 或自动 mostPrefered = findMostPrefered( / 必需参数 */ );
0赞 Lel 10/10/2022
谢谢!但是是否可以在 main 函数中调用数组中的每个值?例如,我想使 mostPrefered1 = 数组的第一个值,而 mostPrefered2 = 数组的第二个值?
0赞 Vlad from Moscow 10/10/2022
@Lel我已经演示了如何访问该对的元素:mostPrefered.first 和 mostPrefered.second。
0赞 Lel 10/11/2022
明白了!非常感谢您的回复和回答!