vector下标越界原因排查:简易加法C++程序运行报错问题
嘿,我来帮你揪出这个导致vector下标越界的bug!你的代码里有两个关键问题,咱们一个个说清楚:
1. 错误使用
sizeof()获取vector的元素数量 这是触发下标越界的核心原因!你在for循环里写了y < sizeof(i),但sizeof()的作用是获取变量/类型在内存中占用的字节数,而不是vector里存储的元素个数。
举个实际的例子:在64位系统上,std::vector对象本身的大小通常是24字节左右(不管你存了1个还是100个元素)。假设你往vector里存了3个整数,sizeof(i)返回的还是24,这时候循环会从y=0一直跑到y=23,而你的vector只有3个元素,当y≥3时,i[y]就会访问到vector范围外的内存,直接触发“下标越界”错误。
正确的做法是用vector自带的size()成员函数,它会准确返回容器里实际的元素个数:
for (y; y < i.size(); y++) { sum = sum + i[y]; }
2. 输入结束条件的小陷阱:
input != 0000 你可能想通过输入0000(四个0)来终止循环,但在C++里,数字开头的0表示这是八进制数,0000其实等价于十进制的0。也就是说,只要你输入单个0,循环就会停止,而不是输入四个0。
如果确实需要用户输入四个0才结束,你得把输入当作字符串处理,比如:
std::string input_str; while (std::cin >> input_str && input_str != "0000") { int input = std::stoi(input_str); numbers.push_back(input); }
如果只是想输入单个0结束,那把条件改成input != 0就可以了。
额外的优化小建议
- 变量名尽量起得有意义,比如把
std::vector<int> i;改成std::vector<int> numbers;,int y;改成int index;,代码可读性会高很多。 - 可以用更简洁的范围for循环来求和,不用手动管理下标:
for (int num : numbers) { sum += num; }
最后给你一份修正后的完整代码参考:
#include <iostream> #include <vector> int main() { std::vector<int> numbers; int input; int sum = 0; // 这里用输入0结束循环,如果你需要四个0结束,换成上面的字符串处理逻辑 while (std::cin >> input && input != 0) { numbers.push_back(input); } // 范围for循环求和 for (int num : numbers) { sum += num; } std::cout << sum << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者Jackson
相关产品推荐
相关产品推荐

