C++ OpenGL中结构体对象传参后访问属性输出为0问题求助
问题根源
你在MyMouse函数中定义的discType d属于栈局部变量,生命周期仅局限于当前else代码块,函数执行完毕后该变量会被系统自动回收销毁。你当前仅给局部变量赋值,没有将数据写入全局存储的disc数组,后续访问disc数组元素时,读取到的是未初始化的默认值0。
修复方案
- 直接操作全局数组对应位置的元素,避免额外创建局部变量:
else { // 直接给全局数组对应元素赋值 disc[numDiscs].pos[0] = (double)x; disc[numDiscs].pos[1] = (double)y; // 给其他成员赋初始值,避免未定义行为 disc[numDiscs].speed[0] = 0.0; disc[numDiscs].speed[1] = 0.0; disc[numDiscs].radius = 15.0; // 可按需调整半径数值 disc[numDiscs].color[0] = 255; disc[numDiscs].color[1] = 0; disc[numDiscs].color[2] = 0; // 测试打印 cout << disc[numDiscs].pos[0] << endl; cout << disc[numDiscs].pos[1] << endl; DrawDisc(&disc[numDiscs]); numDiscs++; glutPostRedisplay(); }
- 如果你需要使用局部变量做临时处理,记得在变量销毁前将数据拷贝到全局数组:
discType d; d.pos[0] = (double)x; d.pos[1] = (double)y; d.speed[0] = 0.0; d.speed[1] = 0.0; d.radius = 15.0; d.color[0] = 255; d.color[1] = 0; d.color[2] = 0; // 拷贝数据到全局数组 disc[numDiscs] = d; DrawDisc(&disc[numDiscs]);
额外注意事项
- 栈变量的指针仅在变量生命周期内有效,变量销毁后继续访问对应指针会触发未定义行为,可能出现乱码、程序崩溃等异常。
- OpenGL鼠标回调的y轴默认是从窗口顶部向下递增,和OpenGL渲染坐标系的y轴方向相反,如果你发现绘制位置上下颠倒,可以将y坐标转换为
(double)winHeight - y。 - 结构体实例创建后建议给所有成员赋初始值,避免读取到栈内存的随机脏数据。
内容的提问来源于stack exchange,提问作者Selva Vignesh
相关产品推荐
相关产品推荐

