#include "stdio.h"
/* array to store data receeived from CAN Bus */
unsigned char a[8] = {0xCD, 0xEF, 0x12, 0x34, 0x50, 0x00, 0x00, 0x00};
typedef struct {
unsigned int a:12;
unsigned int b:12;
unsigned int c:12;
unsigned int unused:28;
}test;
test *tptr;
int main(void)
{
tptr = (test*)((void*)&a); // is this line braking any aliasing rule
if(tptr->a == 0xCDE)
{
printf("\n data received ok");
}
return 0;
}
私は最近、Cでのポインタのエイリアシングに起因する問題について学びました。私は、上記のコードがルールを破っているかどうかを知りたいと思います。それは問題につながるだろうか?struct aliasへのポインタを符号なしchar配列にできますか?
ビットフィールドの順序はマシンと実装に依存することがわかります。私の質問は、より明確に理解したいポインタエイリアシングルールです。
これはクイズサイトではありません。なぜそれはないと思いますか? – Olaf
'#include" stdio.h "'は珍しいです。なぜ#include 'を使用していないのですか? –
melpomene
エイリアスについてはわかりませんが、 'tptr = ...'行には未定義の動作があることは間違いありません。まず、 'B x; (A *)(void *)&x'は賢明なことを保証していません(あなたは 'void *'から元の型 'B *'に変換できることのみが保証されています)。第二に、たとえそれが機能しても、構造体は位置合わせの要件を持つことがあります。 – melpomene