You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL项目编译无报错无法弹出显示窗口,报错0xC0000005如何解决

问题原因及修复方案

错误原因

    1. main函数参数类型错误:glutInit要求传入的第一个参数是int*类型,你将argc定义为引用类型int&,传参时发生内存访问越界,直接触发0xC0000005错误码(内存访问违规)。
    1. Display回调内嵌套百万次循环:GLUT是事件驱动框架,Display函数仅负责单次画面绘制,内部的死循环会完全阻塞GLUT的事件处理逻辑,导致窗口无法正常创建、响应渲染请求。
    1. Reshape回调内递归触发重设窗口大小:glutReshapeWindow会主动触发Reshape回调,你在Reshape内部调用该函数会导致无限递归,最终栈溢出触发崩溃。

修复后的完整代码

#include <GL/glut.h>
#define RATIO 1.2
#define WW 100
#define WH (WW/RATIO)
#define HALFX ((int)(WW/2))
#define HALFY ((int)(WH/2))
#define deltat 0.001
int WindowWidth;
int WindowHeight;

void Display() {
    glLineWidth(4.0);
    float StartShape[12][2] = { {-15,-15},{-5,-15},{0,-5},{5,-15},{15,-15},{15,25},{5,25}, 
    {5,-5},{0,0},{-5,-5},{-5,25},{-15,25} };
    float EndShape[12][2] = { {-15,-15},{-5,-15},{-5,10},{0,0},{5,10},{5,-15},{15,-15}, 
    {15,25},{5,25},{0,15},{-5,25},{-15,25} };
    float IntermediateShape[12][2];
    float VertexColors[12][3] = { {1,0,0},{1,1,0},{1,0,1},{0,1,0},{0,1,1},{0,0,1},{1,0.5,0}, 
    {1,0,0.5},{0.5,1,0},{0.5,0,1},{1,0,0.5},{0,1,0.5} };
    static float Tween = 0.0 - deltat;

    if (Tween < 1) {
        Tween += deltat;
    }
    // 如需循环播放动画,可取消下方注释
    // else {
    //     Tween = 0.0;
    // }
    for (int i = 0; i < 12; i++) {
        IntermediateShape[i][0] = (1 - Tween) * StartShape[i][0] + Tween * EndShape[i][0];
        IntermediateShape[i][1] = (1 - Tween) * StartShape[i][1] + Tween * EndShape[i][1];
    }
    glVertexPointer(2, GL_FLOAT, 0, IntermediateShape);
    glColorPointer(3, GL_FLOAT, 0, VertexColors);
    
    // 移除内部循环,单次绘制即可
    glClear(GL_COLOR_BUFFER_BIT);
    glDrawArrays(GL_LINE_LOOP, 0, 12);
    glutSwapBuffers();
    glutPostRedisplay();
}

void InitGL() {
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-HALFX, HALFX, -HALFY, HALFY);
    glMatrixMode(GL_MODELVIEW);
    glClearColor(0, 0, 0, 0);
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    glShadeModel(GL_SMOOTH);
    glViewport(0, 0, WindowWidth, WindowHeight);
}

void Reshape(int w, int h) {
    // 移除glutReshapeWindow调用,仅更新内部变量和渲染参数即可
    WindowWidth = w;
    WindowHeight = (int)(w / RATIO);
    InitGL();
}

// 修改argc为值类型,不是引用
int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    WindowWidth = (int)(glutGet((GLenum)GLUT_SCREEN_WIDTH) * 0.4);
    WindowHeight = (int)(WindowWidth / RATIO);
    glutInitWindowSize(WindowWidth, WindowHeight);
    glutInitWindowPosition(((int)glutGet((GLenum)GLUT_SCREEN_WIDTH) * 0.1), 
       (glutGet((GLenum)GLUT_SCREEN_WIDTH) / 2) - (WindowHeight / 2));
    glutCreateWindow("Bilguun Erdenebaatar Tweening Midterm Exam");
    glutDisplayFunc(Display);
    glutReshapeFunc(Reshape);
    InitGL();
    glutMainLoop();
    return 0;
}

内容的提问来源于stack exchange,提问作者Bilguun Erdenebaatar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 01:09:03