gpt4 book ai didi

c - memcpy 启动索引真的需要吗?

转载 作者:行者123 更新时间:2023-12-04 10:30:54 28 4
gpt4 key购买 nike

问题是,当我们使用 memcpy() 复制任何字节数组时,我们应该明确声明目标缓冲区的起始(第 0 个)索引,还是简单地提及它就足够了。让我展示我在说什么的例子。假设我们正在尝试将源缓冲区复制到目标缓冲区的开头。

BYTE *pucInputData; // we have some data here
BYTE ucOutputData[20] = {0};

代码 1

memcpy((void*)&ucOutputData, (void*)pucInputData, 20);

代码 2

memcpy((void*)&ucOutputData[0], (void*)pucInputData, 20);

最佳答案

在你的例子中,考虑到这是一个 C 代码片段,ucOutputData 是一个数组

  • memcpy(ucOutputData, pucInputData, 20);
  • memcpy(&ucOutputData[0], pucInputData, 20);

两者相同并且可以互换使用。数组的名称实质上为您提供了数组中第一个元素的地址。

现在,根据下面评论中非常有用的讨论,值得一提的是,

memcpy(&ucOutputData, pucInputData, 20);

也会在这里完成这项工作,但是数组名数组名地址的用法之间存在根本区别。考虑问题中的示例,对于像 BYTE ucOutputData[20] 这样的定义,

  • ucOutputData指向20个BYTE数组的第一个元素的地址。
  • &ucOutputData 是指向 20 个 BYTE 数组的指针。

所以,它们是不同的类型,C 尊重变量的类型。因此,为避免任何可能的误用和误解,推荐的安全使用方法是前两个表达式之一。

FWIW,真的不需要这里的类型转换。任何指针类型都可以隐式和安全地转换为 C 中的 void *

关于c - memcpy 启动索引真的需要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30592192/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com