真的需要memcpy start index吗?

hyp*_*eni 2 c arrays memcpy

问题是当我们使用时复制任何字节数组时,我们是否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)

Sou*_*osh 5

在您的情况下,考虑这是一个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语言.