2016-03-30 2 views
0

Возьмем следующий код:Доступ Указатель ЬурейеЕ из массива байт

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? Или функция Initialize быть больше, как это:

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

Как ни странно, оба будут работать. Я бы сказал, что первый выражает намерение более ясным. – molbdnilo

+0

Как насчет синтаксиса Фрэнка Паффера? Причина, по которой я спрашиваю, заключается в том, что OACR (инструмент анализа времени выполнения) жалуется на первую версию, но я не уверен, что именно я должен использовать. –

+0

Вы также можете использовать 'memcpy (& m_buffer [0], & (* newBuffer) [0], sizeof (MY_BUFFER));' – Pixelchemist

ответ

1

Правильный путь:

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

Оба аргументы memcpy должны быть адреса.

+0

Я бы ожидал, что' m_buffer' будет 'UCHAR [6]' ad 'newBuffer'' UCHAR (*) [6] '. – Pixelchemist

+0

Просьба не опечатать, что я только что исправил в своем ответе: нет смысла передавать указатель на массив. –

+0

Вы ошибаетесь. Это имеет смысл, поскольку передача массивов по значению невозможна. Вы можете пройти по ссылке, но вопрос о вызове 'memcpy', а не о интерфейсе' MY_CLASS'. – Pixelchemist

0

Из:

исключением случаев, когда это операнд оператора SIZEOF или одинарным & оператора, или является строка символов используется для инициализации массива, выражение, которое имеет тип «массив типа» преобразуется в выражение с типом «указатель на тип», который указывает на начальный элемент объекта массива и не является значением lvalue.

Я бы сказал, что ваш первый пример будет путь, чтобы идти (Eventhough OACR жалуется), поскольку вы ни применять & ни sizeof и оба выражения массива должны распадаться на указатели. Можно принудительно, что с помощью:

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

Как заметка на полях: The 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) { } 
}; 
Смежные вопросы