Ваше решение семантически отличается и не будет работать, даже если оно устранит нарушение.
Целью здесь является создание структуры, которая может выступать в качестве заголовка для непрерывных данных, следующих за ним. Так, например, если у вас есть:
struct Message
{
struct abc info ;
char data[128] ;
} message ;
Так, что message.info.data
и message.data
относятся к одной и той же вещи, а приведение struct abc
к struct Message
позволяет определить функцию для передачи любого объекта с заголовком struct abc
. Эффективно поддерживающий полиморфизм в С.
Замена на:
struct abc
{
struct header;
uint8_t* data;
};
семантически отличается, поскольку член data
не ссылается на данные, смежные с header
. Семантика копирования также различается, и вряд ли в контексте кода, использующего исходную структуру, он будет работать так, как задумано.
GCC поддерживает следующий синтаксис:
struct abc
{
struct header;
uint8_t data[0] ;
} ;
но, скорее всего, это не соответствует требованиям MISRA. Соответствующее решение должно иметь:
struct abc
{
struct header;
uint8_t data[1] ;
} ;
Но при этом вставляется дополнительный символ, и любой код, который использует его в качестве заголовка, может потребоваться учитывать это при доступе к данным через член data
.