OpenGL引擎加载自定义OBJ模型解析时触发总线错误,求排查原因
1. 循环边界错误(最直接的崩溃诱因)
主函数遍历索引数组时,错误用数组总长度作为循环上限:
for(i = 0; i < sizeof(verticesindices)/sizeof(unsigned int); i++){ vertex[i] = verticesmodel[verticesindices[i] - 1]; }
sizeof(verticesindices)/sizeof(unsigned int)的计算结果是500(对应你定义的unsigned int verticesindices[500]),但load_obj内部仅填充了前36个索引值(内部数组vertexindices[36]),剩余464个元素都是未初始化的垃圾值。用这些无效索引访问verticesmodel时,必然会超出合法内存范围,触发总线错误。
2. 顶点数据赋值逻辑错误
verticesmodel中每个顶点存储3个浮点分量(x/y/z),比如第N个顶点对应verticesmodel[(N-1)*3]、verticesmodel[(N-1)*3+1]、verticesmodel[(N-1)*3+2]。但你当前代码仅取每个索引对应的单个分量,既没有正确重组完整顶点,还会导致vertex数组越界写入。
3. 类型不匹配问题
load_obj的参数indices、textureindices、normalsindices是int*类型,但主函数传入的是unsigned int数组。虽部分编译器允许编译,但这种类型不匹配可能导致索引值传递/访问时出现异常,若垃圾值被解析为负数,会直接访问非法内存地址。
4. load_obj内部硬编码数组的溢出隐患
load_obj中verticesout[24]、texcoordsout[28]、normalsout[18]、vertexindices[36]都是固定大小数组,若你的model.obj中顶点、纹理坐标、法线或面的数量超过这些数组的容纳上限,会直接触发栈内存越界写入,破坏栈上其他数据,引发不可预测的崩溃(包括总线错误)。
内容的提问来源于stack exchange,提问作者RadoslavL

