C 为什么该功能会出现故障?

C 为什么该功能会出现故障?,c,file-io,segmentation-fault,C,File Io,Segmentation Fault,这困扰了我一段时间;这个函数甚至不返回,它只是检测故障。我指定了一个正确的文件位置,我检查了函数中每个可能点的错误,我不明白 GLchar* getShaderString(const GLchar* file_path){ FILE* srcfile = NULL; if(!(srcfile = fopen(file_path, "r"))) return(NULL); fseek(srcfile, 0l, SEEK_END); long len

这困扰了我一段时间;这个函数甚至不返回,它只是检测故障。我指定了一个正确的文件位置,我检查了函数中每个可能点的错误,我不明白

GLchar* getShaderString(const GLchar* file_path){
    FILE* srcfile = NULL;
    if(!(srcfile = fopen(file_path, "r")))
        return(NULL);
    fseek(srcfile, 0l, SEEK_END);
    long len;
    if((len = ftell(srcfile)) == -1)
        return (NULL);
    fseek(srcfile, 0l, SEEK_SET);
    GLchar* buff;
    if(!(buff = malloc(len + 1)))
        return (NULL);
    fread((GLvoid*)buff, len, 1, srcfile);
    fclose(srcfile);
    buff[len + 1] = '\0';
    return (buff);
}
应该是:

buff[len] = '\0';

数组中有
len+1
元素,最后一个元素位于索引
len

fopen在
const char*
上工作,而不是
const GLchar*


而且,
buff[len+1]='\0'应该是
buff[len]='\0'

索引超出了len+1的范围。不相关,但是如果
fseek
malloc
失败,您也会通过调用
fclose
失败而泄漏
文件
对象。C的0-索引的一个简单基本规则是:给定长度为N的数组a,访问[N]是多余的(但您可以获取其地址)。这个问题似乎离题了,因为它不太可能在将来帮助其他访问者堆叠溢出。@JonathanLeffler:我在一年多前发布了这个问题,为什么它仍然有评论?
GLchar
只是
char
的一个typedef,所以编译器可以这样做,但是是的,OP真的应该在这里编写
constchar*
而不是
constglchar*
。这是OpenGL规范还是碰巧是?我并不是说这是个问题,但OpenGL可能会改变这一点,说支持宽字符是它认为合适的。我会在最短时间过后接受这个答案。但是是的,这是一个OpenGL的字符类型定义。如果他们改变它也没关系,因为这是OpenGL 3.1。@CrazyCasta:OpenGL为数据类型指定了精确的位宽度,所以它们不一定对应--
GLchar
必须精确为8位,根据本手册§2.3.1的规定。
buff[len] = '\0';