2014-07-12 100 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''終止符的字符串。但終止字符串通常比傳入額外參數容易。 –