2017-09-23 1 views
-2

さて、私はWebサーバーを作っていると言って始めます。そして、私は、この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; 
    } 
} 

と、この関数を呼び出すときに、私はいくつかの奇妙な動作を得るように見える私のファイルからの私のコンテンツを取得するために使用する機能getFileContentを持っています。
私は含むFileContentを返すために取得していたときに私は例えば一度この
char *fileContent = getFileContent(path);
ようにそれを呼び出した場合、それは2つのまたは3変な文字を追加します。
しかし、同じ変数に2回コールすると、別の奇妙な文字が追加されます。

しかし、プログラムの最初に関数を呼び出すと、mainになります。たとえば、/etc/hosts/のコンテンツをまったく異なる未使用の変数にすることで、出力をコードの後半に正常に出力します。

私は問題を見ようとしましたが、それは非常にランダムなように見えます。もし誰かが私を助けてくれれば本当にありがたいです。

+1

あなたの関数の終わりは単に 'return buffer;'に置き換えることができます。 –

+0

ファイルを開くのに失敗すると、 'buffer'の初期化されていない値を読み込みます。コンパイラはこれについてあなたに警告することができるはずです... –

答えて

1

ファイルの内容を読むと、バッファはではなく、NULが終了しています。したがって、C文字列(例えばprintf)として扱う場合は、未定義の動作が呼び出されます。

freadの戻り値をチェックし、最後のバイトの読み取り後に'\0'を配置する必要があります。

関連する問題