C/C++ union

來源:互聯網
上載者:User

標籤:

敘述原因:

union data{

int a;
double b;
};

對於union,實際中用的並不多,之前也知道怎樣計算union的單元(在字對齊的基礎上取最大成員所佔的記憶體大小),比如

union data{

int a;
char b[5];
};  最大為5個位元組,但為了字對齊,需要是4的倍數,sizeof(data)大小就是8,其他複雜的結構大家可以網上搜一搜,一般考的可能就是這樣。

 

問題1:

union各資料單元的記憶體位址是否相同?

本人設想擁有最大元素的記憶體單元,那麼各元素的地址是相同的。結果也驗證了正確性。

union data{

int a;
char b;
double c;
char ch[5];
}; 

union data d;
d.a = 10;
printf("%d %d %d %d\n",&d,&d.a,&d.b,&d.c,d.ch); 4個結果全部相同。

問題2:

union data{

int a;
double b;
}; 如果設定了d.a = 10,那麼d.b = ???

是不是有點蒙?如果按照 記憶體位址相同,說明是共用了同一塊資料單元, d.b的值應該也是 10

但是 d.b != 10 。

同理如果設定了d.b = 10,那麼d.a =?? 結果是d.a = 0 

但是對於特殊情況,如果data的結構是

union data{

int a;
char b;
}; 

 如果設定了d.a = 10,那麼d.b =??? 其實這個時候 a.b = 10 原因是 這兩個類型在C語言中的記憶體結構是一樣的,但是 int float double卻不相同。

這也就是要強調 對於結構體你用的什麼賦值,就採用哪一個變數,否則值可能得不到。。

我的想法是: 他們記憶體的資料是一樣,但是不同類型讀取資料的方式不同,導致了資料與賦值資料不同。主要是資料的讀取方式和對記憶體資料的組織方式

 

C/C++ union

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.