问题是当我们使用时复制任何字节数组时,我们是否memcpy()应该显式声明目标缓冲区的起始(第0)索引,或者简单地提到它就足够了.让我举例说明我在说什么.前提是我们正在尝试将源缓冲区复制到目标缓冲区的启动.
BYTE *pucInputData; // we have some data here
BYTE ucOutputData[20] = {0};
Run Code Online (Sandbox Code Playgroud)
代码1
memcpy((void*)&ucOutputData, (void*)pucInputData, 20);
Run Code Online (Sandbox Code Playgroud)
代码2
memcpy((void*)&ucOutputData[0], (void*)pucInputData, 20);
Run Code Online (Sandbox Code Playgroud)
在您的情况下,考虑这是一个C代码片段,并且ucOutputData是一个数组
memcpy(ucOutputData, pucInputData, 20);memcpy(&ucOutputData[0], pucInputData, 20);两者都相同,可以互换使用.数组的名称实际上为您提供了数组中第一个元素的地址.
现在,根据以下评论中非常有用的讨论,值得一提的是
memcpy(&ucOutputData, pucInputData, 20);
Run Code Online (Sandbox Code Playgroud)
也将在这里做的工作,但有一个根本区别的使用之间数组名和数组名的地址.考虑到问题中的示例,对于像这样的定义BYTE ucOutputData[20],
ucOutputData指向20 BYTEs 数组的第一个元素的地址.&ucOutputData是一个指向20 BYTEs 数组的指针.因此,它们是不同类型的,C尊重变量的类型.因此,为了避免任何可能的误用和误解,使用它的推荐和安全的方法是前两个表达式中的任何一个.
FWIW,这里的演员真的不需要.任何指针类型都可以隐式地安全地转换为void *C语言.