0

コードブロック、C. fwrite を使用して、.txt ファイルに文字を書き込もうとしています。最初の数文字は正しく書き込まれますが、その後のファイルは次のようになります: _mcleanup: tos ov. バッファオーバーロードの可能性があると思います。何か案は?

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    FILE*p1;

    p1=fopen("Tomi.txt","w+");

    fseek(p1,0,SEEK_SET);

   // fwrite("Toth Tamas",sizeof(char),30,p1);

    while(a<10)
        {
            fwrite("Toth Tamas",sizeof("Toth Tamas"),1,p1);

            a++;

        }

    return 0;
}
4

1 に答える 1

0

int a = 0;の直後に追加するFILE *p1;と、プログラムの while ループ バージョンは、最大の警告があっても問題なくコンパイルされ、valgrind の下でもコンピューターでエラーなしで実行されます。呼び出しでNULバイトがファイルに書き込まれないようにする必要があり、おそらく「Tamas」の後にある必要がありますsizeof("Toth Tamas") - 1。他の小さな問題については以前のコメントを参照してください。ただし、そのコードはほとんど問題ないようです。fwrite\n

ただし、コメントアウトされた行//fwrite("Toth Tamas",sizeof(char),30,p1);にはバグがあります。文字列定数の"Toth Tamas"長さはわずか 11 バイト (終端の NUL を数えて) ですが、fwrite30 バイトを書き込むように要求したため、文字列の末尾を超えてさらに 19 バイトにアクセスします。未定義の動作をトリガーします。コンテキストでは、セグメンテーション違反、またはファイルに書き込まれたガベージのいずれかが予想されます。

また、「_mcleanup: tos ov」の長さは 17 バイトなので、それが実行可能ファイルの読み取り専用データ セグメントの次の文字列定数 (の先頭) である場合、ファイルに書き込まれたガベージとして表示されるのはもっともらしいことです。あなたが言っていることが起こったと思います。

于 2013-09-24T21:41:43.453 に答える