次のコードを使用して質問を説明します。
typedef struct __attribute__((packed))
{
uint8_t var;
uint16_t array[3];
}struct_t;
uint8_t frame[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD};
volatile struct_t *ptr = NULL;
volatile uint16_t *u16ptr = NULL;
volatile uint16_t a;
volatile uint16_t b;
//******************************************************************************************
int main(int argc, char** argv)
{
ptr = (struct_t*)frame;
u16ptr = ptr->array;
a = ptr->array[0]; // <---- NO Memory Access Exception here
b = *u16ptr; // <---- Memory Access Exception here!
}
そのコードでarray
は、メモリアクセス例外を発生させるために、メモリを非整列にする必要があります。
だから私の質問は、ポインターを介してアライメントされていない uint16 配列にアクセスするときに「アライメント例外」がスローされるのに、配列添字を使用して配列にアクセスするときにスローされないのはなぜですか?
これまでに見つけたリソースのどれも、 と の両方の行a = ptr->array[0];
がb = *u16ptr;
まったく同じアライメントされていないメモリにアクセスしている場合、これがなぜなのかを説明していません。
誰かが説明したり、正しい方向を示してくれませんか?