0
#include<stdio.h>
struct mystruct
{
    char cc;
    float abc;
};
union sample
{
    int a;
    float b;
    char c;
    double d;
    struct mystruct s1;
};
int main()
{
    union sample u1;
    int k;
    u1.s1.abc=5.5;
    u1.s1.cc='a';

    printf("\n%c %f\n",u1.s1.cc,u1.s1.abc);
    k=sizeof(union sample);
    printf("%d\n\n",k);
    return 0;
}

演算子のサイズが返さ8れます一度に複数の構造要素にアクセスできますが、sizeof演算子は私が想定するプリミティブデータ型の最大サイズを返します。なぜこの動作なのですか?実際に割り当てられているサイズは8?そして、sizeofは間違った値を返していますか?または、実際に割り当てられたサイズは8?では、構造はどのように収容されますか?mallocを使用してユニオンの配列を割り当てるsizeof場合、そのような場合に十分なスペースが割り当てられますか?詳しく説明してください。

4

4 に答える 4

6

通常、ユニオンのサイズはその最大メンバーのサイズです。最大のメンバーは、[おそらく]あなたの構造体メンバーとdoubleメンバーです。どちらもサイズは8です。つまり、sizeof正しく言われているように、ユニオンのサイズは確かに8です。

なぜあなたはそれが奇妙だと思いますか?なぜあなたは8を「間違った価値」と呼ぶのですか?

于 2012-07-25T04:45:04.967 に答える
2
struct mystruct
{
    char cc;   //1 -byte 
    //3 bytes Added here for Padding
    float abc; //size of float is 4-bytes
};

したがって、1 + 3 + 4=8バイトです。

私たちは、メモリが組合の最大のメンバーに割り当てられることを知っていました。この場合、sizeof(double)= sizeof(struct mystruct)は両方とも8です。

于 2012-07-25T04:59:56.457 に答える
1

ユニオンは、同じメモリ位置に複数のメンバーを配置するために使用されます。一度に複数のメンバーを使用することはできません。それらはすべて重複しているため、ユニオンのサイズは最大のメンバーのサイズと同じです。

于 2012-07-25T04:45:36.870 に答える
0

共用体型は、異なる型の説明を使用して同じメモリにアクセスできるようにする特別な構造体です。たとえば、整数、浮動小数点数、またはユーザーが宣言した型と同じデータを読み取ることができるデータ型の和集合を記述することができます。

union 
{
    int i;
    float f;
    struct 
    {
     unsigned int u;
     double d;
    } s;
} u;

上記の例では、sがiとfの両方よりも大きいため、uの合計サイズはusのサイズ(usuとusdのサイズの合計)です。uiに何かを割り当てるときに、uiがufより小さい場合、ufの一部が保持される場合があります。

于 2012-07-25T04:57:23.460 に答える