我是C ++语言的新手,正在尝试完成一个非常简单的代码挑战以将数组中的所有数字相加。测试环境没有显示错误消息,它只给我一个退出代码139。经过一些研究,这意味着我的代码正在产生未定义的行为(也可能是内存碎片?)。仅仅是语法上的东西还是C ++我缺少的东西?
#include <vector>
int sum(std::vector<int> nums) {
int runningSum = 0;
for (int i=0; i <= nums.size(); i++) {
runningSum = runningSum + nums[i];
}
std::cout << "The total sum for nums: " << runningSum;
}
答案 0 :(得分:3)
您的函数应该返回。您没有,所以在那里您有未定义的行为。
您的循环超出了向量的最后一个元素,即另一个UB。
这是固定版本:
int sum(std::vector<int> nums) {
int runningSum = 0;
for (int i=0; i < nums.size(); i++) {
// ^^^^
runningSum = runningSum + nums[i];
}
std::cout << "The total sum for nums: " << runningSum;
return runningSum;
// ^^^^
}
请注意,std::accumulate可以为您做同样的事情。
按照@ gast128的建议,可以更改函数签名以避免复制向量:
int sum(const std::vector<int>& nums)
答案 1 :(得分:0)
对不起,是的,我只需要返回结果。我还必须删除<=并替换为<,但留下<=给我一个退出代码139。
答案 2 :(得分:0)
我还想简要介绍一下std::vector<>::operator[]
的使用。
从文档here中可以看出,它返回了向量中元素的引用。但是与std::vector<>::at
不同,将operator[]
与数字n >= vector.size()
一起使用会导致未定义的行为。
如果您改用std::vector<>::at
,它将引发out_of_range异常,这更加健谈。