memcpy额外的起始字符

时间:2013-04-12 18:11:23

标签: c memcpy

我在使用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;
}

1 个答案:

答案 0 :(得分:1)

我只在这里猜测,但我的猜测是fileInfo->szFileName指针。这意味着&fileInfo->szFileName是指向的指针,因此您可以复制到完整的其他内存区域。

此外,您不会复制所需的终止'\0'字符。在分配和复制时,您需要fileNameLen + 1

如果你真的想要它在连续的内存中,你应该将结构更改为以大小为零的字符数组结束(编译器可能不支持,然后使用大小为1的数组)并使用{{ 1}}作为要分配的大小。然后,您可以将该数组用作普通字符串数组。


如果你修复那些问题,你还有另一个问题:你没有初始化指针指向分配的内存。这意味着它将指向一些随机存储器。

所有这些错误都会导致未定义的行为,我会说你很幸运它没有崩溃。