如何解决初学者C ++代码中发生的未定义行为?

时间:2019-11-19 16:35:36

标签: c++ arrays for-loop

我是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;
}

3 个答案:

答案 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异常,这更加健谈。