2017-09-23 39 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的返回值,并在读取最后一个字节后放置一个。