-1

memcpy 操作が実行されたときに次のように表示されるという点で、memcpy の使用に問題があります。

"ÍÍWF03-021913.datýýýý««««««««þ"

取得する必要がある場合:

"WF03-021913.datýýýý««««««««þ"

これらの主要な「ÍÍ」がどこから来ているのかわかりません。

コード:

注: lpszFileName = "WF03-021913.dat"

typedef struct {
    BYTE  cbRequestType;
    BYTE  cbFileName;   
    char* szFileName;      
} UFTP_GET_FILE_INFO_REQUEST;

BOOL Uftp_BuildFileInfoRequest(PUFTP_REQUEST request, LPCTSTR lpszFileName)
{
    UFTP_GET_FILE_INFO_REQUEST *fileInfo;
    int fileNameLen;

    if (lpszFileName == NULL) {
        ASSERT( 0 );
        return FALSE;
    }

    fileNameLen = strlen( lpszFileName );
    if (fileNameLen == 0)
        return FALSE;

    request->dwRequestSize = sizeof(UFTP_GET_FILE_INFO_REQUEST) - 
                             sizeof(void*) + fileNameLen;
    request->RequestBuffer = malloc( request->dwRequestSize );
    if ( !request->RequestBuffer ) {
        TRACE0("Failed to allocate RequestBuffer");
        return FALSE;
    }

    fileInfo = (UFTP_GET_FILE_INFO_REQUEST*) request->RequestBuffer;
    fileInfo->cbRequestType = UFTP_GET_FILE_INFO;
    fileInfo->cbFileName = fileNameLen;

    memcpy(&fileInfo->szFileName, lpszFileName, fileNameLen);
    return TRUE;
}
4

1 に答える 1

1

私はここで推測しているだけですが、私の推測ではそれfileInfo->szFileNameポインタです。これは、それ&fileInfo->szFileNameポインタへのポインタであることを意味するため、完全に別のメモリ領域にコピーします。

'\0'また、必要な終了文字をコピーしません。fileNameLen + 1割り当て時とコピー時の両方で必要です。

すべてを連続したメモリに格納したい場合は、サイズ 0 の文字配列で終わるように構造体を変更し (コンパイラでサポートされていない可能性があるため、サイズ 1 の配列を使用してください)、sizeof(UFTP_GET_FILE_INFO_REQUEST) + fileNameLen + 1割り当てるサイズとして使用する必要があります。 . その後、配列を通常の文字列配列として使用できます。


これらの問題を解決すると、さらに別の問題が発生します。割り当てられたメモリを指すようにポインターを初期化しません。これは、ランダムなメモリを指すことを意味します。

これらのエラーはすべて未定義の動作につながります。クラッシュしなかったのは幸運だったと思います。

于 2013-04-12T18:14:33.093 に答える