2017-09-23 65 views
-2

好吧,我會開始說我正在做一個網絡服務器。我有一個功能getFileContent我用它來從我的文件讓我的內容,看起來像這樣從函數讀取文件中的意外行爲C

char* getFileContent(char *filename) 
{ 
    long length; 
    char *buffer; 
    FILE *f = fopen (filename, "r"); 
    if (f) { 
     fseek (f, 0, SEEK_END); 
     length = ftell (f); 
     fseek (f, 0, SEEK_SET); 
     buffer = malloc (length + 1); 
     if (buffer) { 
      fread (buffer, 1, length, f); 
     } 
     fclose (f); 
    } 

    if (buffer != 0) { 
     return buffer; 
    } else { 
     return NULL; 
    } 
} 

並調用這個函數的時候,我得到一些奇怪的行爲。
如果我只是這樣稱呼它
char *fileContent = getFileContent(path);
例如,當我得到filecontent返回,它附加了2或3個怪異的字符。
但是,如果我將它調用兩次給同一個變量,它會追加另一組奇怪的字符。

但是,如果我第三次在程序開始時調用函數main。例如,通過將/etc/hosts/中的內容轉換爲完全不同且未使用的變量,它會在代碼後面正常打印輸出。

我試過看到這個問題,但它似乎很隨意,如果有人能幫助我,我真的很感激它。

+1

然後你的函數結束可以用'return buffer;'替換。 –

+0

如果打開文件失敗,則讀取'buffer'的未初始化值。編譯器應該能夠警告你這個... –

回答

1

當您讀取文件內容時,您的緩衝區是而不是NUL已終止。因此,如果您將其視爲C字符串(例如printf),則會調用未定義的行爲。

您應該檢查fread的返回值,並在讀取最後一個字節後放置一個。