C++ range-based for loop部分类型可用 vector<char>运行异常原因
异常诱因
这个问题和vector<char>的类型特性没有关系,本质是对范围for循环的语义理解偏差,加上之前测试整型容器时的巧合让你误以为写法正确:
- 范围for循环遍历容器时,你定义的循环变量
i存储的是当前遍历到的容器元素本身,不是元素对应的下标索引。 - 之前你测试整型数组、整型vector时,大概率存入的元素值恰好是从0开始的连续整数(比如0、1、2、3),和元素下标值完全一致,因此
myVector[i]刚好能命中对应位置的元素,属于歪打正着的巧合,并不是写法本身正确。如果整型vector存入的是不匹配下标的值(比如{5,6,7}),一样会出现异常。 - 你当前的
vector<char>中存储的元素是'a'、'b'、'c'、'd'、'e',这些字符对应的ASCII码值分别是97、98、99、100、101,你把这些字符值当下标去访问myVector[97]、myVector[98]这类位置,而你的vector实际长度只有5,属于严重的数组越界访问,触发了未定义行为,输出的红点就是越界读到非法内存内容产生的乱码。
正确写法
使用范围for循环输出元素时,直接输出循环变量即可,不需要额外通过下标访问:
#include <iostream> #include <vector> using namespace std; int main(){ vector<char> myVector {'a', 'b', 'c', 'd'}; myVector.push_back('e'); for (auto i : myVector){ cout << i << endl; } return 0; }
如果遍历过程中确实需要获取元素下标,不建议用范围for,改用常规的下标遍历写法即可。
内容的提问来源于stack exchange,提问作者Allen Ding
相关产品推荐
相关产品推荐

