memcpy额外的起始字符

memcpy额外的起始字符,c,memcpy,C,Memcpy,我在使用memcpy时遇到了一些问题,因为当执行memcpy操作时,我得到: “WF03-021913.日期«««««««««««»” 当我应该得到: “WF03-021913.日期««««««««««««»” 我不知道这些主要的“ÍÍ”来自哪里 代码: 注意:lpszFileName=“WF03-021913.dat” 这里我只是猜测,但我猜fileInfo->szFileName是一个指针。这意味着&fileInfo->szFileName是指向指针的指针,因此可以复制到内存的另一个完整区域

我在使用memcpy时遇到了一些问题,因为当执行memcpy操作时,我得到:

“WF03-021913.日期«««««««««««»”

当我应该得到:

“WF03-021913.日期««««««««««««»”

我不知道这些主要的“ÍÍ”来自哪里

代码:

注意:lpszFileName=“WF03-021913.dat”


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

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

如果您真的希望所有内容都在连续内存中,您可能应该将结构更改为以大小为零的字符数组结尾(编译器可能不支持,然后使用大小为1的数组),并使用
sizeof(UFTP\u GET\u FILE\u INFO\u REQUEST)+fileNameLen+1
作为要分配的大小。然后可以将该数组用作普通字符串数组


如果您解决了这些问题,您还有另一个问题:您没有初始化指向已分配内存的指针。这意味着它将指向一些随机内存


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

您是否尝试了
memcpy(&(fileInfo->szFileName)、lpszFileName、fileNameLen)
我不确定操作员的顺序。你能给我们看一下
UFTP\u GET\u FILE\u INFO\u REQUEST
吗?你为什么用
memcpy
而不是
strcpy
?另外,你能在
memcpy()
之前打印出
lpszFileName
并将其包含在你的问题中吗?如果
szFileName
表示以null结尾的字符串,那么您就不需要
memcpy(&fileInfo->szFileName,…)
中的
。cbFileName成员保留长度,因此可能不需要终止null。如果他复制fileNameLen+1,他将超过分配的内存量。(参见malloc调用)。但是,我同意这个答案的其余部分,除非szFileName是一个灵活的数组成员(我们不知道它是否存在)。@WhozCraig除非OP真的希望在看起来合适的文件名后面有奇怪的字符,否则我认为他/她会将其用作一个正常的以零结尾的字符串。这很可能就是他所表示的,但是,如果它是结构的一部分,那么就不需要cbFileName成员。如果它应该是一个以null结尾的字符串,那么您可以将一个较小的malloc添加到您的一系列错误中。从更新后的代码中呈现的结构来看,它拼命想成为一个灵活的数组成员结构,但失败得很惨。关于设置伪灵活数组成员的说明+1。我认为这是他想要的,但是结构也应该是1字节压缩的。另外,如果他包含数组[1],那么def中的额外字节实际上可以算作终止符,因此他只需要
+fileNameLen
是的,指向指针的指针就是问题所在,感谢您的快速帮助。
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;
}