如何修复初学者C++代码中发生的未定义行为
How do I fix the undefined behavior that is happening in my beginner C++ code?
我是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异常,这更为健谈。
相关文章:
- 编译C++时未定义的引用
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 如何修复C++中未定义的引用?
- 如何修复初学者C++代码中发生的未定义行为
- 如何修复架构x86_64的未定义符号,Boost Asio 1.58
- 如何修复"未定义的引用"错误 opencv 和 g++
- Microsoft Visual C++, Visual Studio, 如何修复错误: 标识符"GetAsyncKeyState"未定义
- 如何修复生成文件以正确包含 -lcrypto 以避免链接器错误:未定义对"EVP_CIPHER_CTX_new"的引用
- 什么是未定义的引用/未解决的外部符号错误以及如何修复它
- 如何修复编译器错误未定义引用
- 什么是C++中的不确定行为?它与未定义的行为有何不同
- 修复了对dlopen()和dlose()的未定义引用
- 对类构造函数的未定义引用,包括.cpp文件修复
- 如何修复对'b2World::b2World(b2Vec2 const&)'的未定义引用
- 未声明标识符和标识符未定义是什么意思?如何修复错误
- 如何修复对vtable的未定义引用
- 如何在CLion中修复对"__imp_WSACleanup"(Boost.Asio)的未定义引用
- 如何在CLion中修复对"GetAcceptExSockaddrs"(Boost.Asio)的未定义引用