C++循环中vector push_back无法正常持续添加元素问题
问题原因
代码输出异常的核心bug在数组长度计算逻辑:
- 你定义的
v是int*类型指针,指向vector存储元素的首地址 sizeof(v)计算的是指针变量本身占用的内存大小,根本不是指向的数组总长度:64位环境下int类型指针占8字节,单个int元素占4字节,sizeof(v)/sizeof(v[0])的计算结果固定为2,和你实际输入了多少个元素完全无关,所以排序函数永远只会处理前2个元素,输出自然不符合预期。- 你写的选择排序逻辑、
while循环里的push_back调用本身都是正常工作的,vector实际已经存入了你输入的所有元素,并非真的只生成了长度为2的数组。
修复方法
直接用vector提供的内置方法获取实际元素个数,不要用sizeof计算指针指向的数组长度(sizeof只能在编译期确定栈数组长度,对指针、动态分配的数组完全无效):
把main函数中这部分错误代码:
// Convert vector to array (dynamic to static) int* v = &vDyn[0]; // Get array length int len = sizeof(v) / sizeof(v[0]);
替换为:
int* v = vDyn.data(); // 获取vector首元素指针,和&vDyn[0]效果一致 int len = vDyn.size(); // 读取vector实际存储的元素总数
替换后重新编译运行,输入测试值6、2、3、9后会正确输出2, 3, 6, 9。
可选优化
你现在初始化vector的逻辑可以简化,不需要提前开辟1个元素的空间再手动给第一个元素赋值,直接初始化空vector,所有输入的元素统一走push_back添加即可,能减少冗余代码,避免初始化阶段的赋值错误。
内容的提问来源于stack exchange,提问作者bryterlayter
相关产品推荐
相关产品推荐

