该程序接收一个指向const char *数据类型的指针,将一个文本文件从磁盘加载到内存中,并将结果char []的第一个索引的地址传回(实际上将文件的内容传递回一个'字符串')。
这很好用,但有时会使用文件内容传回一些额外的字符。
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
char* loadShaders(char* PATH) {
FILE *fp = fopen(PATH, "rb");
if (fp == NULL) {
perror("[ctb.h] loadShaders() ");
printf("[ctb.h] loadShaders() recieved file path: %s\n", PATH);
exit(-1);
}
fseek(fp, 0, SEEK_END);
long fsize = ftell(fp);
rewind(fp);
char* shader = malloc(fsize + 1);
fread(shader, fsize, 1, fp);
shader[fsize + 1] = '\0';
fclose(fp);
return shader;
}
当它确实传回多余的字符时,结果如下所示:
#version 330 core
layout (location = 0) in vec3 aPos;
void main() {
gl_Position = vec4(aPos, 1.0);
}�
正如您可能已经猜到的那样,&#34;�&#34;不属于。
建议?
答案 0 :(得分:3)
此行通过注销数组的结尾导致未定义的行为:
shader[fsize + 1] = '\0';
易于修复:
shader[fsize] = '\0';