以下应用程序与nullpointer崩溃。我想知道什么是错的......
#include "stdio.h"
#include "string.h"
char* getFileData(char* fileName);
bool createShader( int shaderType, const char* shader, const char* shaderFile ) ;
void glShaderSource(int shader, int count, const char** string, const int* length);
int main(int argc, char* argv[])
{
char* shader = getFileData("filea.csd");
bool success = createShader(1, shader, "filea.csd");
return 0;
}
char* getFileData(char* fileName) {
if(!strcmp(fileName, "filea.csd"))
return "this is the content of the file a\0";
else if(!strcmp(fileName, "fileb.csd"))
return "this is the content of the file b\0";
else if(!strcmp(fileName, "filec.csd"))
return "this is the content of the file c\0";
else
return "";
}
bool createShader( int shaderType, const char* shader, const char* shaderFile )
{
int shaderHandle = 122;
glShaderSource( shaderHandle, 1, &shader, NULL ); ////This line is where it crashes.
return true;
}
void glShaderSource(int shader, int count, const char** string, const int* length) {
}
答案 0 :(得分:1)
我认为从glCreateShader检查返回值可能是一件好事。确保它不为零。
该行
delete shader
也错了。它可能没有崩溃但你需要使用free
释放malloc分配的内存。
答案 1 :(得分:1)
由于指针为NULL,请尝试传递双指针。形式的东西
bool createShader( GLenum shaderType, const char** shader, const char* shaderFile )//<-- change
{
GLuint shaderHandle = glCreateShader( shaderType );
glShaderSource( shaderHandle, 1, shader, NULL ); //<--change
glCompileShader( shaderHandle );
int status = 0;
glGetShaderiv( shaderHandle, GL_COMPILE_STATUS, &status );
}
void main () {
char* shader = strdup(getFileData("filea.csd"));
bool success = createShader(shaderType, &shader, "filea.csd"); //<--change
delete shader;
return success;
}
答案 2 :(得分:0)
我看到的一个错误是这一行:
delete shader;
如果着色器指向的内存分配了new运算符,那么该行只能正常工作。但是如果我们看一下你的getFileData()方法,我们会看到它返回的字符数组不是由new分配的,而是静态数据。
所以解决方法是让getFileData()返回一个由new运算符分配的字符数组,或者更好的是std :: string。使用动态分配的字符数组进行字符串处理非常容易出错,不推荐使用。