1

質問が私の問題を説明してくれることを願っています。また、「うまくいく」という回避策を説明していただければ幸いです。

ファイルを読み取る従来の方法(私が知っている)

int fd;
char buffer[MAX];
while(read(fd,buffer,MAX)>0)
{
         buffer[MAX]='\0';
         write(sockfd,buffer,MAX);
         memset(buffer,NULL,MAX);
}

オーバーフローを引き起こしていました。どういうわけか予期せずに機能した回避策は

   while((read(fd,buffer,MAX)!=0)||(read(fd,buffer,MAX)!= -1))
   {
         buffer[MAX]='\0';
         write(sockfd,buffer,MAX);
         memset(buffer,NULL,MAX);

   }

^^このコードはファイル全体を出力し、観察可能な限りスキップしません。

のようなもの

do
{
     int temp;
     temp=read(fd,buffer,MAX);
     if((temp == 0) || (temp == -1))
     {
              break;
     }
     buffer[MAX]='\0';
     write(sockfd,buffer,MAX);
     memset(buffer,NULL,MAX);
 }while(1);

また、スタックオーバーフローが発生しました。ここで本当に重要なものが欠けていますか?

ありがとう

4

4 に答える 4

3

なぜそれがオーバーフローを引き起こしていると言うのですか?

配列の最後にread()aが書き込まれないことに注意してください。そのため、このようなことを行うと、NULで終了する文字列が予期されるため、失敗する可能性があります。正の場合、 number_of_read_charactersが返される場所を読み取り、設定することをお勧めします。\0charprintf("%s", buffer)printfMAX-1buffer[number_of_read_characters] = '\0'read()

また、を宣言するときchar buffer[MAX]、Cではインデックス付けがゼロベースであるため、最高のbufferインデックスがMAX-1であることに注意してください。したがって、設定しbuffer[MAX]='\0'ているときは、すでに配列の範囲外になっています。

于 2009-10-27T13:51:17.207 に答える
1

1つの問題:

buffer[MAX]='\0';

サイズMAXの配列の最大の有効なインデックスはMAX-1であるため(0ベースのインデックスのため)、スタック上のステップ。

-1読み取りからの戻り値はエラーを示します。したがって、read()> 0をテストするのは正しいことです。さらに、読み取りからの通常の戻り値は読み取られたバイト数であり、読み取りは0の終了を保証しません。あなたはの線に沿って何かをしなければなりません

while (bytesRead=read() > 0) {
    write(buffer, bytesRead);
...
于 2009-10-27T13:59:52.263 に答える
0

コードを一瞥すると、ロジックが異なるためだと思います。

動作する例では、read(fd,buffer,MAX)メソッドは2回実行されています。

次のように考えてください。

while (dosomething() != 0 || dosomething() != -1)
{
    // some work
}

dosomething()メソッドがべき等である場合、このループは無限になりますが、whileステートメント内で最初に実行したときに2番目のステートメントと異なる場合、ループは中断されます。

これは実行パスの違いを説明していますが、最初のオプションがオーバーフローする理由がわかりません...それについて考えて更新します。(またはそうではありません-答えられたようです!)

于 2009-10-27T13:57:56.867 に答える
0

これを試して:

int fd, readCharacter;
char buffer[MAX];
while( readCharacter = read(fd, buffer, MAX**-1**) > 0 )
{
    buffer[readCharacter] = '\0';
    // ...
}
于 2009-10-27T14:00:01.977 に答える