C++中操作vector的代码输出全部为0与预期不符是什么原因?
问题原因
核心原因是std::vector下标访问越界,触发了C++标准定义的未定义行为:
- C++中
std::vector的下标从0开始计数,push_back()操作会将新元素追加到容器末尾,新元素对应的下标等于插入前容器的size值。 - 循环逻辑中i从1到10依次执行:
- 第一次循环i=1,
push_back执行后容器size为1,只有下标0是合法访问范围,此时访问g1[1]已经越界 - 后续每次循环i的值都会比当前容器的最大合法下标大1,直到循环结束所有的下标访问都是非法越界操作
- 第一次循环i=1,
- 未定义行为的表现是不确定的,你当前运行环境刚好读取到的越界内存值都是0,所以输出全0,其他运行环境下可能出现程序崩溃、输出乱值等不同结果。
修复方案
有两种简单的修复方式:
- 调整访问的下标为合法值,将打印行改为:
cout << g1[i-1] << " "; - 直接读取容器末尾的最新插入元素,不需要手动计算下标:
cout << g1.back() << " ";
内容的提问来源于stack exchange,提问作者aashish
相关产品推荐
相关产品推荐

