0

文字ポインタを使用した後に解放しようとしていますが、奇妙なエラーが返されます。

エラーは言う:

_CrtDbgREport: 文字列が長すぎるか、IO エラーです

デバッガー自体は、コンパイル中にエラーを返しません。

コードは現在次のようになっています。

void RespondToUser(SOCKET client, SOCKET server)
{
    char buffer[80];
    char *temp = malloc(_scprintf("HTTP/1.1 200 OK\r\n%s\r\nServer: %s\r\nConnection: close\r\n\r\nHi!", buffer, SERVER_NAME));
    sprintf(temp, "HTTP/1.1 200 OK\r\n%s\r\nServer: %s\r\nConnection: close\r\n\r\nHi!", buffer, SERVER_NAME);

    send(client, temp, strlen(temp), 0);
    closesocket(client);
    free(temp);
    ListenToUsers(server);
}

この問題は、メモリから一時ポインターを解放しようとしたときにのみ発生し、それ以外の場合は発生しません。何が原因でしょうか?

4

1 に答える 1

1

sprintf()からの戻り値_scprintf()には NULL ターミネータが含まれていないため、への呼び出しは (NULL ターミネータを追加するため) 最後に 1 つ書き込みます。参考_scprintf()ページより:

指定された書式設定コードを使用して文字列が出力されるか、ファイルまたはバッファーに送信される場合に生成される文字数を返します。返される値には、終端の null 文字は含まれません。

これは、プログラムの動作が未定義であることを意味します。s 戻り値に修正+ 1します。_scprintf()

于 2012-11-17T22:57:53.347 に答える