0

オンラインで見つけたこのサンプル コードを理解するのに苦労しています。これを理解するのを手伝ってくれませんか

#define PKTNAME     "Msg"
FILE *data;       
char outMsg[1500]="getmybw\0";

data = fopen(PKTNAME,"r");
printf("file open success!!\n");
if(fgets(outMsg, 1024, data))
    printf("Msg read success!\n"); 
outMsgLen = strlen(outMsg)+1;
printf("outMsgLen is: %d,\toutMsg is:\n%s\n",outMsgLen,outMsg);

また、このコードを実行すると、次の行でセグメンテーション違反が発生します。

if(fgets(outMsg, 1024, data))

4

1 に答える 1

1

もちろん。

最初に、コード スニペットは、1025 バイトの長さのバッファーへのポインターをポインターに割り当てることによってメモリ リークを発生させ、その後、 の戻り値を再割り当てします。malloc()datafopen()

第 2 に、コードは が常に成功すると誤って想定しfopen()、誤解を招く情報メッセージをユーザーに出力してから、1 行または最大 1023 バイトを buffer に読み取ろうとしますoutMsg

3 番目に、呼び出しがfgets()成功すると、「成功」メッセージが出力されます。

ステップ 4 では、読み取ったばかりのデータの長さを取得し、それを誤ってタイプの変数 (代わりにそうする必要があります) に割り当ててから、intを使用して長さとメッセージをコンソールに表示します。size_tprintf()


つまり、この「サンプル コード」を提供した人は、プログラミングを永久に禁止する必要があります。

于 2013-03-18T06:11:20.903 に答える