2012-07-25 96 views
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?那麼這個結構怎麼樣?如果我們使用mallocsizeof分配一組工會,它會在這種情況下分配足夠的空間嗎?請詳細說明。解釋sizeof操作符的結果爲工會含結構

+0

'sizeof(double)== 8'不要忘了結構對齊/填充。 – Mysticial 2012-07-25 04:45:20

+0

結構需要'9'的大小嗎? – sasidhar 2012-07-25 04:47:35

+0

@sasidhar,對您的程序進行一次修改:http://ideone.com/2HhTn – chris 2012-07-25 04:48:17

回答

6

通常,聯合的大小是其最大成員的大小。最大的成員是[可能]您的結構成員以及double成員。因此,正如sizeof正確告訴你,聯盟的大小確實是8.

爲什麼你覺得它很奇怪?你爲什麼稱8爲「錯誤的價值」?

+0

它如何容納'結構'成員? – sasidhar 2012-07-25 04:46:09

+0

@sasidhar:你的「如何」是什麼意思?你的結構成員的大小可能是8(檢查它)。 union的大小是8.所以,union的確足夠大以容納struct成員。你在哪裏看到這個問題? – AnT 2012-07-25 04:47:58

1

聯合會用於將多個成員放置在同一個內存位置 - 一次不能使用多個成員。它們全部重疊,所以聯盟的大小與最大成員的大小相同。

0

聯合類型是允許使用不同類型描述訪問相同內存的特殊結構。人們可以,例如,描述數據類型的聯合,這將允許讀取相同的數據爲一個整數,浮子或用戶聲明的類型

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

在上述例子中u的總大小是的大小我們(這是usu和usd大小的總和),因爲s比i和f都大。當給u.i分配一些東西時,如果u.i小於u.f,u.f的某些部分可能會被保留。

2
struct mystruct 
{ 
    char cc; //1 -byte 
    //3 bytes Added here for Padding 
    float abc; //size of float is 4-bytes 
}; 

so 1 + 3 + 4 = 8字節。

我們知道內存將分配給工會的最大成員。在我們的例子中sizeof(double)= sizeof(struct mystruct)是8.