如何修复编译警告control reaches end of non-void function [-Wreturn-type]
问题定位
你收到的control reaches end of non-void function [-Wreturn-type]警告核心问题出在findUnique函数:
- 该函数声明为
int返回类型,但编译器检测到存在执行路径走到函数末尾也没有返回值的情况。 - 你预设了数组中必然存在且仅存在一个出现一次的元素,其余元素均出现两次,这种业务场景下唯一值一定会在
while循环内被返回,但编译器无法识别这个业务前提,会判定while循环正常结束(i >= n退出循环)的路径没有返回值,因此触发警告。 - 另外你的代码还存在隐藏的数组越界问题:当
i等于n-1时,访问a[i+1]等价于访问数组下标为n的元素,超出了合法的数组下标范围0~n-1。
修复方案
调整findUnique函数的循环边界,补充循环外的返回语句即可同时解决警告和越界问题,修改后的代码如下:
int findUnique(int *a, int n){ sort(a, a+n); int i=0; // 循环条件改为i < n-1,避免i+1越界 while(i < n-1){ if(a[i]==a[i+1]){ i += 2; } else{ return a[i]; } } // 能走到循环结束,说明唯一值就是下标为i的最后一个元素,直接返回 return a[i]; }
内容的提问来源于stack exchange,提问作者Killjoy
相关产品推荐
相关产品推荐

