基本的c指针返回

时间:2012-06-04 03:07:27

标签: c++ pointers

以下应用程序与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) {
}

3 个答案:

答案 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。使用动态分配的字符数组进行字符串处理非常容易出错,不推荐使用。