したがって、私のプログラムには変数があります
uint32_t buffer[16];
ただし、これを次のように扱う必要がある場合があります。
uint8_t char_buffer[64];
最も明白な解決策はユニオンです。しかし、知的好奇心から、配列を任意の型の配列として扱いたいことをコンパイラに伝える別の方法はありますか? の線に沿った何か
((uint8_t *)buffer)[i]
?
したがって、私のプログラムには変数があります
uint32_t buffer[16];
ただし、これを次のように扱う必要がある場合があります。
uint8_t char_buffer[64];
最も明白な解決策はユニオンです。しかし、知的好奇心から、配列を任意の型の配列として扱いたいことをコンパイラに伝える別の方法はありますか? の線に沿った何か
((uint8_t *)buffer)[i]
?
キャスティングアプローチは完璧です。これにより、コンパイラは配列を int の配列として扱います。あなたの特定のケースでは、使用します
((uint32_t *)buffer)[index];
ただし、@ JerryCoffin が指摘しているように、調整には問題があります。配列を として静的に静的に割り当てる場合、char []
必ずしも 4 バイトでアラインされるとは限りません (これは整数に必要です)。確実にこの問題を回避したい場合はmalloc()
、適切なアラインメントが保証されるので使用してください。
ISOC99規格は次のように述べています。
オブジェクトへのポインタが文字型へのポインタに変換されると、結果はオブジェクトの最下位アドレスバイトを指します。オブジェクトのサイズまでの結果の連続的な増分は、オブジェクトの残りのバイトへのポインターを生成します。
これは、もしそうならuint8_t
(typedef unsigned char
そしてuint8_t
あなたのシステムに存在していなければならない)、あなたのコードは機能しなければならないことを意味します:配列参照は逆参照ポインタ+int加算と同等です。
これは、にキャストする char
場合にのみ機能することに注意してください。他の方法または他の方法でキャストすることは、最終的にキャストバックできるという意味でのみ機能することが保証されており、最終的には元の値と等しくなります。たとえば、32ビットのlongの配列から16ビットのshortの配列にキャストすることはできず、ほとんどのCPU /コンパイラの組み合わせで実際に機能する可能性がありますが、標準の下で何かを確認することはできません。