2011-07-18 5 views
0

ここで私はLinuxでc read関数に関する奇妙な問題を抱えています。奇妙な読み取りバッファー

#include <stdio.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <errno.h> 

int main(int argc, char** argv){ 
    int fd=open("a.c",O_RDONLY); 
    if(fd==-1){ 
     fprintf(stderr,"%s\n",strerror(errno)); 
    } 
    char buf[10]; 
    if(read(fd,buf,9)==-1){ 
     fprintf(stderr,"%s\n",strerror(errno)); 
    }else{ 
     printf("%s\n",buf); 
    } 
} 

iはbufがゼロに初期化されるべきだと思うので、読んで最初の9文字はバッファリングするために、最後の一つは、文字列と同じように「\ 0」であると。しかしresuleは、以下、奇数である交流ファイルと、このプログラムの結果である、 交流

1234567890abcd 

結果

1234567893øþzôo` 

は、この文字列がバッファの外で、私は何が起こったのかを把握することはできませんようです誰も助けてくれますか?ありがとう。

答えて

1

にBUFを初期化する必要がありますあなたは、「私はbufがゼロに初期化されるべきだと思う」と述べました。それはあなたが望むものであるならば、あなたはそれを自分で行う必要がありますので、コンパイラは、あなたのためにこれを自動的に行いません。

char buf[10]; 
memset(buf, 0, sizeof(buf)); 

バッファが初期化される前に、その内容がどうなるかには何の保証もありません。

+2

また、 'char buf [10] = {0};'です。 – Hugh

+0

は0に設定されていますが、デフォルトではコンパイラがbufをゼロに初期化しなかったのはなぜですか? ** static char buf [10] **にコードを変更すると、正しい出力が得られます。** char buf [10] **と** static char buf [10] **の静的持続時間は同じですが、同じようにデフォルトで初期化する必要があります –

+0

ok。私はそれを得た、彼らは異なっている、私は間違いを理解した。 'char buf [10]'はmain()ブロック内にあるため初期化されません。あなたに感謝します。 –

2

'\ 0'を含まない文字配列を出力すると、printfは '\ 0'が見つかるまですべての文字をメモリに出力します。この場合、 '1234567893øþzôo`の後に' \ 0 'が続きます。 printfは 'buf'配列のサイズを知らないので、buf配列の終わりの後に存在する文字さえも出力します。

バッファ全体を0に設定するか、最後に明示的に '\ 0'を追加することをお勧めします(下のコードを参照)。

buf[9] = '\0'; 
1

ISTMバッファがゼロで終了していないのは、9文字しか読み取れないためです。コードの最後の部分を変更してください:

if(read(fd,buf,9)==-1){ 
    fprintf(stderr,"%s\n",strerror(errno)); 
    }else{ 

    /* add this */ 
    buf[9] = '\0'; 

    printf("%s\n",buf); 
    } 
} 

追加するとどうなりますか?

0

あなたはすべて0

関連する問題