質問: sizeof(data)`であって、メモリイメージ上同じであるから問題無い。 (2-3)一般に`char`のメモリ上の配置にはアライメント制約が存在しない。(私的予想では先頭部分はアライメントを考慮した配置がされている)なので、`char`より大きいサイズのデータの読み出し(つまり`*(struct foo*)data`すること)は、アライメント制約ルール違反であり動作未定義である。(構造体としてラップされてはいるが実質同じcharの2次元配列なので関係無い?または`memcpy`のように1バイトずつコピーがされると考えて良いのであれば関係無い?)
回答: まとめのようなもの(なのでコミュニティwikiで) (1)については、Hidekiさんの回答の通りであり問題無い。 (2) (1)から `memcpy(&f, data, sizeof(data));`と`memcpy(f.data, data, sizeof(data));`は同じである。 (ごちゃごちゃ考えるよりこうするのが問題無いやり方w) (2-2-1) 検証コード ``` #include struct foo { char data[7][7]; } f; int main (void){ printf("size of f : %zu\n", sizeof f); } ``` 結果: ``` size of f : 49 ``` この結果からはこの場合パディングは存在しない。(実装依存の可能性もあるかも) (2-2-2) 検証コード ``` #include #include struct foo2 { char data[7][7]; int no; } f2; int main (void){ printf("size of f2 : %zu\nsize of int : %zu\n", sizeof f2, sizeof(int)); struct foo2 a, b; memset(&a, 0, sizeof(a)); memset(&b, -1, sizeof(b)); b.no = 0x11111111; a = b; unsigned char *p = (void *)&a; for(size_t i = 0; i < sizeof a; ++i){ printf("%02x ", *p++); if((i + 1) % 7 == 0)puts(""); } puts(""); } ``` 結果 ``` size of f2 : 56 size of int : 4 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 11 11 11 11 ``` この結果からは、 構造体の代入においてメンバー相互に代入が行われるのみではなくパディングもコピーされる。 おそらくメンバー個別に代入が行われるのではなく全体が`memcpy`のようにコピーされることが推測される。(実装依存?) (2-2-3) (2-2-1)と(2-2-2)の結果から最後のメンバーの後ろには(構造体自体における)パディングはないと予想される。 なので、 メンバーのタイプが`char`の配列の場合でパディングが存在しない場合は問題無し。 これが予想される結論 (2-3) 86系のマシンではアライメントバイオレーション例外を起こさないので検証コードが書けないw。 しかし、例外を起こすマシンでは、 ``` char a[5]; int d = *(int*)&a[1]; ``` のようなコードは例外を起こすに違いない。 (`char`の場合は問題無いだろうから拡張した問題として) 問題は、 ``` struct Integer { int d; }; ``` のような構造体でラップした時に `int`で読み出されるのか(OUT!) `memcpy`のようにバイトで読み出されるのかということ。(OK!) 今のところ「`memcpy`のようにバイトで読み出される」というのが予想だが、 (構造体自体のサイズは一般に不定であり中身が`int`(特定のプリミティブ)であるからといって`int`で読み出すようなことが行われるとは考えにくい、最適化結果としてそういうことがあるかもしれないとするとダメだが、パディングが一緒にコピーされることから考えるとメンバーに固有のサイズによって処理を変えているとは思えない) これって実装依存なのか? それともやはり動作未定義なのか? (それとも動作はするだろうけれども規格上動作未定義?)