访问指向字节数组的typedef的指针

时间:2016-03-30 14:54:20

标签: c++ arrays pointers typedef

请使用以下代码:

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));
    }

2 个答案:

答案 0 :(得分:1)

正确的方法是:

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

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

答案 1 :(得分:0)

因为:

  

除非它是sizeof运算符或一元&的操作数。 operator,或者是一个用于初始化数组的字符串文字,一个类型为"类型为"的数组的表达式。转换为类型为#34的表达式;指向类型"它指向数组对象的初始元素,而不是左值。

我说你的第一个例子是要走的路(尽管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) { }
};