C++ int数组转vector<int>无可行转换及段错误问题咨询
报错1:类型转换失败(No Viable Conversion)
- 含义:函数声明的返回值类型为
vector<int>,你实际返回了长度为2的int原生数组,C++不支持这两种类型的隐式转换。 - 触发原因:
std::vector是STL提供的容器类,封装了动态内存管理、长度记录等功能;原生数组本质是指向内存空间的指针,无额外封装信息,二者属于完全不同的数据类型,不存在默认转换规则,因此返回数组会触发类型不匹配报错。
报错2:段错误(Segmentation Fault)
- 含义:程序尝试访问了未被分配权限的内存地址,属于内存访问越界错误。
- 触发原因:你声明的
vector<int> scores;是一个空vector,初始长度为0,没有分配任何存储元素的内存空间。后续直接通过scores[0]、scores[1]对下标位置赋值,属于访问vector未申请的内存区域,触发越界访问导致段错误。
代码修复说明
另外你原有逻辑存在隐藏错误:当a[i]与b[i]相等时,按照题目规则双方都不得分,但你原有代码的else分支会把相等情况判定为sB得分,会导致结果不符合要求。
提供两种正确写法:
写法1:初始化时指定vector长度
vector<int> compareTriplets(vector<int> a, vector<int> b) { int sA = 0, sB = 0; // 初始化长度为2的vector,提前分配内存 vector<int> scores(2); for(int i = 0; i < 3; i++){ if (a[i] > b[i]){ sA++; } else if (a[i] < b[i]) { sB++; } // 相等情况无操作,双方均不加分 } scores[0] = sA; scores[1] = sB; return scores; }
写法2:用push_back动态添加元素
vector<int> compareTriplets(vector<int> a, vector<int> b) { int sA = 0, sB = 0; vector<int> scores; for(int i = 0; i < 3; i++){ if (a[i] > b[i]){ sA++; } else if (a[i] < b[i]) { sB++; } } // 动态追加元素,vector会自动申请内存扩容 scores.push_back(sA); scores.push_back(sB); return scores; }
相关知识学习渠道
- C++标准文档STL容器章节,重点掌握
std::vector的初始化、元素访问、常用方法的使用规则 - 高校C++专业课程的内存管理、STL容器相关章节
- C经典教程《C Primer》的序列容器、数组相关章节
内容的提问来源于stack exchange,提问作者Horia Duna
相关产品推荐
相关产品推荐

