2014-07-12 85 views
-1

时不分配我有以下代码:字符串访问

// Get characters of file 
int numChars = 0; 
while(fgetc(file) != EOF) 
    numChars++; 

// Allocate memory for shader string 
char * shaderString = malloc(numChars * sizeof(char)); 

// Rewind file to read in string 
rewind(file); 

// Read in file 
while((*shaderString++ = fgetc(file)) != EOF); 

printf("Shader to compile:\n%s\n", shaderString); 

// Make shader 
GLuint shader = glCreateShader(shaderType); 
glShaderSource(shader, 1, &shaderString, NULL); 
glCompileShader(shader); 

printf("Shader compiled:\n%s\n", shaderString); 

出于某种原因,该字符串shaderString似乎并没有通过任何一种printfglShaderSource电话访问。另一个有趣的事情是,当我尝试拨打free(shaderString)时,出现无法分配内存的错误。通常,我在打印报表中没有任何内容,或者偶尔会遇到问号或随机文本,所以我觉得它一定是我错过的简单东西。如果我将puts(*(shaderString-1))与指定字符串的while循环一起添加,它会尽可能打印着色器文件,但偶尔会随机使用OpenGL信息。

编辑:运行与LLDB代码后,我发现了shaderString变量的内容是"ot foun\x05""\x04\x01"加载两个不同的文件,这似乎可能随着文件的末尾去的时候好像我从来没有所谓的rewind(file),但这并不能解释如何尝试puts(*(shaderString-1))的工作原理。

+1

为什么你想到的是'shaderString'仍然指向字符串的开头你增加了它? –

+0

@ReetoKoradi我似乎忽略了这一点,但意识到它解决了我所遇到的主要问题。 – danielunderwood

回答

1
// Get characters of file 
    int numChars = 0; 
    while(fgetc(file) != EOF) 
     numChars++; 

    // Allocate memory for shader string 
    char * shaderString = malloc(numChars * sizeof(char) +1); // +1 for '\0' 

    // Rewind file to read in string 
    rewind(file); 

    // if no pTemp, u can't find the start of your string 
    char* pTemp = shaderString; 
    // Read in file 
    while((*pTemp++ = fgetc(file)) != EOF); 
    *pTemp = '\0'; 

    printf("Shader to compile:\n%s\n", shaderString); 

有些错误。

+0

如果它是一个字符串,是否需要始终在char指针末尾具有空终止符?另外,你知道什么可能导致我在我的字符串的最后得到一个问号吗?我认为这是一个编码问题,但用'cat -v'读取文件并没有显示任何控制字符或文件末尾的任何内容。 – danielunderwood

+0

没有空终止符,c \ C++不知道这里是这个字符串的结尾。 c \ C++使用结尾标记为空终止符的C风格字符串。 – arbboter

+0

如果'glShaderSource()'的最后一个参数不是NULL,则它被用作字符串长度的数组。所以如果你传入字符串的长度,你可以传入没有''\ 0''终止符的字符串。但终止字符串通常比传入额外参数容易。 –