【问题标题】:Access Pointer to typedef of Byte Array指向字节数组的 typedef 的访问指针
【发布时间】:2016-03-30 14:54:19
【问题描述】:

取以下代码:

typedef UCHAR MY_BUFFER[6];

class MY_CLASS
{
    MY_BUFFER m_buffer;

    void Initialize(const MY_BUFFER* newBuffer)
    {
        memcpy(m_buffer, *newBuffer, sizeof(MY_BUFFER));
    }
};

在上面的 Initialize 函数中,将字节从 newBuffer 复制到 m_buffer 的正确方法是什么?或者初始化函数应该更像这样:

    void Initialize(const MY_BUFFER* newBuffer)
    {
        memcpy(&m_buffer, newBuffer, sizeof(MY_BUFFER));
    }

【问题讨论】:

  • 奇怪的是,两者都可以。我认为第一个更清楚地表达了意图。
  • Frank Puffer 建议的语法怎么样?我问的原因是 OACR(构建时间分析工具)抱怨第一个版本,但我不确定我应该使用什么。
  • 你也可以使用memcpy(&m_buffer[0], &(*newBuffer)[0], sizeof(MY_BUFFER));
  • @Pixelchemist:是的,但你为什么要这样做?
  • @FrankPuffer:如果不出意外的话,我还是会选择void Initialize(const MY_BUFFER & newBuffer) { std::copy(std::begin(newBuffer), std::end(newBuffer), std::begin(m_buffer)); }。 (而不是伪装的C 代码。)

标签: c++ arrays pointers typedef


【解决方案1】:

正确的做法是:

void Initialize(const MY_BUFFER newBuffer)
{
    memcpy(m_buffer, newBuffer, sizeof(MY_BUFFER));
}

memcpy的两个参数都必须是地址。

【讨论】:

  • 我希望 m_bufferUCHAR[6] 广告 newBufferUCHAR(*)[6]
  • 请不要我刚刚在回答中纠正的错字:将指针传递给数组是没有意义的。
  • 你错了。这是有道理的,因为按值传递数组是不可能的。您可以通过引用传递,但问题是关于对memcpy 的调用而不是MY_CLASS 的接口。
  • @Pixelchemist:我想我明白你的意思,它看起来好像数组是按值传递的,而实际上只是传递了它的地址,newBuffer 实际上是只是函数内部的UCHAR*。考虑到这一点,我建议将参数类型声明为const UCHAR* newBuffer
【解决方案2】:

因为:

除非它是 sizeof 运算符或一元 & 运算符的操作数,或者是用于初始化数组的字符串字面量,否则类型为“array of type”的表达式将转换为类型为“pointer to”的表达式type" 指向数组对象的初始元素,不是左值。

我想说你的第一个例子是要走的路(尽管 OACR 抱怨),因为你既不应用 & 也不应用 sizeof 并且两个数组表达式都应该衰减为指针。您可以通过以下方式强制执行:

memcpy(&m_buffer[0], &(*newBuffer)[0], sizeof(MY_BUFFER));

作为旁注:c++-“方式”做事(当涉及到静态大小缓冲区时)可能更像:

// template MY_CLASS to be able to change buffer size later
template<std::size_t N>
class MY_CLASS
{
  // use std::array instead of C-style array
  // and add direct brace initialization for zero initialization
  std::array<unsigned char, N> m_buffer{};
public:
  // value (zero) initialization
  MY_CLASS() = default;
  // constructor for copy initialization
  MY_CLASS(std::array<unsigned char, N> const &init_buffer)
    : m_buffer(init_buffer) { }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多