В этом подходе есть что-то неправильное : хотя стандарт гарантирует, что элементы структуры будут храниться в ожидаемом порядке, он не гарантирует, что они являются смежными (некоторые отступы могут быть добавлены между некоторыми элементами),
[class.mem] / 17: Нестатические члены-данные класса с одинаковым контролем доступа распределяются так, чтобы более поздние члены имели более высокие адреса в объекте класса.(...) Требования к выравниванию реализации могут привести к тому, что два соседних элемента не будут выделяться сразу после друг друга;так могут предъявляться требования к пространству для управления виртуальными функциями и виртуальными базовыми классами.
Тот факт, что все члены unsigned char
снижает риск (например, нет проблем с выравниванием, нет неожиданностей по порядку байтов), но это не гарантируетсяработать на 100%.Вы должны по крайней мере утверждать, что структура имеет ожидаемый размер, чтобы избежать неприятных сюрпризов:
assert(sizeof(mxt_config)==7);
Если, несмотря на риски, вы хотите продолжить, вам необходимо исправить свой код:
for (int i = 0; i < 7; i++)
{
*((unsigned char*)&cfg->id + i) = line1[i];
}
В качестве альтернативы, вы можете выбрать алгоритм, std::copy()
:
copy (line1, line1+7, reinterpret_cast<unsigned char*>(&cfg->id));