提问人:Lel 提问时间:10/10/2022 最后编辑:Vlad from MoscowLel 更新时间:10/10/2022 访问量:312
返回的局部变量“bestIdx”的 C++ [警告] 地址 [-Wreturn-local-addr] [重复]
C++ [Warning] address of local variable 'bestIdx' returned [-Wreturn-local-addr] [duplicate]
问:
我目前正在编写一个返回数组的函数,但它在编译时一直显示返回 [-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;
}
答:
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
明白了!非常感谢您的回复和回答!
评论
std::array
std::vector
std::pair<int, int>
struct