【发布时间】:2013-04-26 18:34:34
【问题描述】:
我有以下代码,取自我正在处理的 OpenGL 应用程序的一部分。 GDB 在调用glfwInit() 时立即报告代码段错误。奇怪的是,如果我将 height 的值更改为 256(或者至少是 height
#include <GL/glew.h>
#include <GL/glfw.h>
static const size_t width = 512;
static const size_t height = 512;
int main(int argc, char const *argv[])
{
glfwInit();
glfwOpenWindow(1080, 720, 8, 8, 8, 0, 32, 0, GLFW_WINDOW);
glewInit();
float heightmap[width * height * 3];
for (size_t i = 0, ix = 0; i < width; i++) {
for (size_t j = 0; j < height; j++) {
float noise = 0.0f;
heightmap[ix++] = (float)i;
heightmap[ix++] = noise;
heightmap[ix++] = (float)j;
}
}
const int numIndices = (width - 1) * (height - 1) * 6;timd
GLuint indices[numIndices];
for (size_t i = 0, ix = 0; i < width - 1; i++) {
for (size_t j = 0; j < height - 1; j++) {
indices[ix++] = (i + 0) + (j + 0) * width;
indices[ix++] = (i + 1) + (j + 0) * width;
indices[ix++] = (i + 0) + (j + 1) * width;
indices[ix++] = (i + 0) + (j + 1) * width;
indices[ix++] = (i + 1) + (j + 0) * width;
indices[ix++] = (i + 1) + (j + 1) * width;
}
}
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, width * height * 3 * sizeof(float), heightmap, GL_STATIC_DRAW);
GLuint ebo;
glGenBuffers(1, &ebo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, numIndices * sizeof(GLuint), indices, GL_STATIC_DRAW);
do {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_INT, NULL);
glfwSwapBuffers();
} while(glfwGetKey(GLFW_KEY_ESC) != GLFW_PRESS);
glDeleteBuffers(1, &vbo);
glDeleteBuffers(1, &ebo);
glfwCloseWindow();
glfwTerminate();
return 0;
}
来自 GDB 的回溯显示
#0 0x00000000004009d7 in main (argc=<error reading variable: Cannot access memory at address 0x7fffff6fe41c>, argv=<error reading variable: Cannot access memory at address 0x7fffff6fe410>) at segfault.c:8
我正在使用gcc -g -o segfault segfault.c -lGL -lGLEW -lglfw 进行编译。
我不知道是什么导致了这个错误,我不明白为什么更改 height 的值会影响段错误。
编辑:发布更多代码。段错误仍然发生,宽度/高度为 512,但在 256 处运行良好。
【问题讨论】:
-
嗯,
512 * 512 * 3,再次乘以 3,每个浮点数为 4 个字节,得到 3145728 个字节。或 3.14 MB(PI?!)。这也只是一个数组,稍后您还将创建另一个索引数组。你确定你没有完全消除你的堆栈和可能的堆吗?即,尝试在堆上动态分配这些数组。应该安全一点。哦,也许检查一下 GCC 的标准堆栈大小是多少(我不使用 GCC,所以我帮不上什么忙)?我可能完全不认为堆栈/堆损坏是一个问题。 -
by 4 for 4 bytes per float* 完全忘了解决这个问题。 -
@Hydronium:我在调用
glBufferData()时犯了一个错误,但是您在堆上分配的建议解决了我的问题。随意添加答案,我会接受。
标签: c opengl segmentation-fault glew glfw