代码之家  ›  专栏  ›  技术社区  ›  TasosFrago

通过引用传递给函数时,整型数组似乎会自行解除分配

  •  -3
  • TasosFrago  · 技术社区  · 1 年前

    我正在尝试制作一个opengl程序。我制作了一些文件来抽象它的一些功能。这是我的代码:

    VAO_t vao[2];
    
    // First Polygon
    vaoGen(&vao[0]);
    vaoBind(&vao[0]);
    
    int len1;
    float *polygon1Verts = genPolygonVerts({ .x=0.5f, .y=0.5f, .radius=0.3f }, ids.ID1, &len1);
    float *polygon1Colors = genPolygonColors(len1, 1.0f, 0, 0);
    
    VBO_t *vbo1 = (VBO_t *)malloc(sizeof(VBO_t) * 2);
    // VBO_t *vbo1 = new VBO_t[3];
    vboGen(&vbo1[0], polygon1Verts, sizeof(float) * len1, GL_STATIC_DRAW);
    vboGen(&vbo1[1], polygon1Colors, sizeof(float) * len1, GL_STATIC_DRAW);
    
    VBLayout_t vbl1;
    vbl_new(&vbl1, 3 * sizeof(float));
    vbl_push_float(&vbl1, 3);
    vbl_push_float(&vbl1, 3);
    
    vaoAddBufferM(&vao[0], &vbo1, &vbl1);
    printf("hello\n");
    DBG_GLCHECKERROR();
    

    我的问题在于vbo1数组。我用malloc分配它,然后用vboGen函数调用初始化它的元素。VBO_t被类型化为uint。但当vaoAddBufferM运行时,我会出现分段错误。这是它的代码:

    void vaoAddBufferM(VAO_t *vao, VBO_t *vbo[], VBLayout_t *layout)
    {
        vaoBind(vao);
        uint32_t offset = 0;
        for(uint32_t i = 0; i < layout->size; i++) {
            DBG_ASSERT(vbo[i] != NULL);
            vboBind(vbo[i]);
            glEnableVertexAttribArray(i);
            DBG_GLCHECKERROR();
            glVertexAttribPointer(
                i,
                layout->elements[i].count,
                layout->elements[i].type,
                layout->elements[i].normalized,
                layout->stride,
                (const void *)(size_t)offset
                );
            DBG_GLCHECKERROR();
            offset += layout->elements[i].count * layout->elements[i].typeSize;
        }
    }
    

    我试着用gdb调试它。在函数调用之前,vbo1数组具有第一个元素1和第二个元素2,其中vboGen使用glGenBuffer对其进行初始化。但在vaoAdderBufferM中,第二个元素消失了,我无法用gdb访问内存,这导致了vaoBind试图读取它时出现分段错误。我很困惑,不知道是什么导致了这种行为。我运行valgrind以获取更多信息,我得到:

    ==2703110== 1 errors in context 1 of 3:
    ==2703110== Use of uninitialised value of size 8
    ==2703110==    at 0x10BF02: vboBind (vbo.c:6)
    ==2703110==    by 0x10BDC9: vaoAddBufferM (vao.c:44)
    ==2703110==    by 0x10A675: main (58633_11.cpp:74)
    ==2703110==  Uninitialised value was created by a stack allocation
    ==2703110==    at 0x10A3CE: main (58633_11.cpp:36)
    

    我不明白这个信息。为什么它说它是由堆栈分配创建的。malloc不在堆中分配吗?

    1 回复  |  直到 1 年前
        1
  •  0
  •   Barmar    1 年前

    由于您将指针传递给 vbo1 ,在函数中对指针进行索引之前,需要先取消对指针的引用。

    但首先不需要传递变量的地址。只需传递指针,并对其进行索引即可获取元素。

        vaoAddBufferM(&vao[0], vbo1, &vbl1);
    
    void vaoAddBufferM(VAO_t *vao, VBO_t vbo[], VBLayout_t *layout)