我正在尝试制作一个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不在堆中分配吗?