C++ 浮点循环为vector赋值触发segmentation fault (core dumped) 求助
段错误触发根因
未分配空间就访问vector元素
全局声明的vector<float> sinal默认构造后size为0,没有任何可用的元素存储空间。直接执行sinal[0] = 0属于向未申请的内存地址写入数据,这是触发段错误的最直接原因。注意:
vector的[]运算符不做下标合法性检查,也不会自动扩容,传入的下标只要超过当前vector的实际长度,就会直接访问非法内存。使用浮点数作为vector下标
循环变量i是float类型,取值从0.1开始递增,直接写sinal[i]、sinal[i-1]本质是将浮点数强制转换为无意义的整数下标(例如0.1、0.2转成整数都为0),哪怕提前给vector分配了空间,这种写法也完全达不到“依次为相邻位置赋值”的预期逻辑。浮点数相等判断的逻辑隐患
浮点数累加存在固有的精度误差,直接判断i == 1大概率永远不会成立,循环会持续执行直到再次触发内存越界。
修正后符合预期逻辑的代码
#include <vector> #include <iostream> using namespace std; // 提前分配足够的元素空间:对应从0到1、步长0.1共11个数值 vector<float> sinal(11); int main(){ sinal[0] = 0; // 用整数类型做循环下标,规避浮点数精度问题 for (int idx = 1; idx <= 10; idx++){ float current_step = idx * 0.1; // 在上一个元素值的基础上加0.5完成赋值 sinal[idx] = sinal[idx - 1] + 0.5; if (current_step == 1){ break; } cout << "\n" << sinal[idx]; } getchar(); cin.get(); }
内容的提问来源于stack exchange,提问作者DepletedKnowledge
相关产品推荐
相关产品推荐

