Cでは、私は持っています
struct a {
int a;
char b[16];
int c;
};
のインスタンスのメモリはどのようにstruct a
なっていますか、それは構造体領域でフラットですか、または内部struct a
にポインタがありますか?たとえば、構造体のサイズは4 + 16 + 4、または4 + 4 + 4ですか?
私が持っている場合はどうなりますか
struct a A,B;
A->b = B->b;
?
構造体aのインスタンスのメモリはどのようになっていますか、構造体領域とフラットになるのでしょうか、それとも構造体の内部にポインタがありますか
フラット。
配列メンバーは実際の配列であり、のサイズは次のstruct
ようになります。
2*sizeof(int) + 16 (+ padding)
私が持っている場合はどうなりますか
struct a A,B A->b = B->b
コンパイルエラー。配列は割り当てできません。
構造体領域でフラットになりますか、それとも構造体の内部にポインタがありますか?
フラットになります。つまり、配列は物理的に構造体の内部にあります
構造体A、B A-> b =B->bがある場合はどうなりますか
構造体はこれとは何の関係もありません。構造体のメンバーであるかどうかに関係なく、配列を相互に割り当てることができないため、コンパイルエラーが発生します。ループまたはを使用しますmemcpy
。
ただし、構造体全体を割り当てることができ、配列がコピーされます
A = B; //the arrays inside will be copied.
を使用しfor
ます。配列に割り当てることはできません(配列名を左辺値として使用することはできません)。
for (i = 0 ; i < 16; i++)
A->b[i] = B->b[i];
サイズは、sizeof
少なくともを返し2 * sizeof(int) + 16 * sizeof(char)
ます。パディングにより、値が高くなる場合があります。
タイトルの質問に答えるために、あなたはそれを書いた形にすることはできませんが、組合の助けを借りて行うことができます:
struct A {
int a;
union {
char b[16];
struct { char b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15; }
};
int c;
};
これで、次のように割り当てて使用できます。
const A test = {
.a = 1,
.b0 = 'a', .b1 = 'b', .b2 = 'c', .b3 = 'd', .b4 = 'e', .b5 = 'f', .b6 = 'g', .b7 = 'h', .b8 = 'i', .b9 = 'j', .b10 = 'k', .b11 ='l', .b12 ='m', .b13 ='n', .b14 ='o', .b15 = 'p',
.c = 255
};
printf("The final b is >%c<.\n", test.b[15]); // prints: The final b is >p<.
これは、構造体内の固定サイズの配列(他の人が言及している)のフラットレイアウトと、共用体(この場合は匿名の共用体)により、異なる識別子を持つ異なるタイプを介して同じメモリ位置にアクセスできるために機能します。基本的に、ここでは事前に型キャストを設定しているだけです。