请使用以下代码:
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));
}
答案 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) { }
};