2017-03-07 5 views
1

短い符号なし整数のみからなる構造体があれば、同じサイズの連続したメモリ位置に格納されます。短い符号なし整数の配列がある場合も同じことが適用されます。彼らはどのように違うでしょうか?彼らはどのようにアクセスされていますか?私は、配列演算子がそのメモリ位置からオフセットを設定している間、配列の開始値を参照するポインタを使って配列にアクセスすることを知っています。構造体に同じことが適用されるか、各部分のメモリ位置を使って構造体にアクセスされますのデータですか?同じデータ型の構造体と配列の違いは何ですか?

+2

違いは、(プリプロセッサの特定の命令を与えることなく)構造体に追加されてもされないかもしれないパディングを制御しないことです。配列は 'shorts'の* x-number *だけであり、' struct'は追加されたすべてのパディングを加えたものです。 –

+1

'struct'は関数から渡されたり返されたりすることができます。配列はできません。 – chux

+0

私は、パディングなしで一連の連続したメモリ位置を関数から渡したいと仮定しましたが、何をする必要がありますか? –

答えて

2

いいえ、それらは同じである必要はなく、おそらくそうではありません。

構造体メンバーの場合、メンバー間にパディングが存在する可能性があります。したがって、連続するメンバーが連続したメモリに常駐することは保証されません。この場合、実装に基づいて、最初の要素のアドレスを使用するポインタ演算は、の作業が有効であるかどうかは関係ありません。構造物内の無名 パディングがあるかもしれませんC11標準、章§6.7.2.1/ P15、構造体と共用体指定子の関連部分、

を引用

[..]ではなく、その先頭に。

章§6.5.3.4、sizeofオペレータ、

[...] は構造体または共用タイプを有するオペランドに適用した場合、結果は総数でありますこのようなオブジェクト内の内部および末尾のパディングを含む バイトです。

ただし、配列の場合、すべてのメンバーは連続したメモリに常駐することが保証されており、ポインタ演算は確定的です。

+0

"*いいえ、彼らは同じである必要はありません。" - 同意した "*そしておそらく、彼らは*"そうではありません。メンバーがすべて同じ型の構造体は、それらを連続して割り当てる可能性が非常に高いでしょう。しかし、コンパイラがそのメンバよりも構造上のより厳密なアライメントを行うことを決定した場合、最終的にはパディングが存在する可能性があります。 –

関連する問題