如何修复初学者C++代码中发生的未定义行为

How do I fix the undefined behavior that is happening in my beginner C++ code?

本文关键字:未定义 何修复 初学者 C++ 代码      更新时间:2023-10-16

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

您的函数应该返回。你没有,所以你在那里有未定义的行为。

您的循环超出了向量的最后一个元素,该元素有另一个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)

对不起,是的,我只需要返回结果。我还必须删除<=并替换为<但是离开<=给了我出口代码139。

我还想添加一个关于std::vector<>::operator[]使用的快速说明。

从这里的文档中,您可以看到它返回向量中元素的引用。但与std::vector<>::at不同,使用编号为n >= vector.size()operator[]会导致未定义的行为。

如果您使用std::vector<>::at,它会抛出out_of_range异常,这更为健谈。