2015年2月27日 星期五

struct與union練習&宣告型態個別是幾byte

今天在學習struct與union的差異, 首先第一部分先說明這兩者的差異點, 第二部分再研究一下各個型態宣告所佔的記憶體大小。


一. struct與union的差異
- 當你宣告了一個struct他所佔的記憶體空間會是所有的membrt大小加起來, 舉個例:

  struct example_struct{
      double a;
      int b;
  };

  從上面的struct我們可以簡單的計算整個struct所佔用的空間是12byte. 接下來我們來看union.


  union所佔用的記憶體空間只會是member當中最大的一個member的size. 舉個例子來說明:

  union example_union{
     double a;
     int b;
  };

這個union所佔用的記憶體空間為8byte. 相對於struc來說是較省空間, 但是使用上必須特別小心,為什麼這麼說呢? 下面再舉個例子:

/************************ example_1,c ********************/

#include <stdio.h>

struct example_struct{
  int a;
  char b;
};

union example_union{
  int a;
  char b;
};

int main()
{
   struct example_struct m_struct;
   union example_union m_union;

   //struct
   m_struct.a = 3;
   printf("m_struct.a=%d\n", m_struct.a);
   m_struct.b = 'c';
   printf("m_struct.a=%d, m_struct.b=%d\n\n", m_struct.a, m_struct.b);

   //union
   m_union.a = 3;
   printf("m_union.a=%d\n", m_union.a);
   m_union.b = 'c';
   printf("m_union.a=%d, m_union.b=%d\n", m_union.a, m_union.b);
}

/*********************************************************/

輸出結果如下:
m_struct.a=3
m_struct.a=3, m_struct.b=99

m_union.a=3
m_union.a=99, m_union.b=99    //<===== the value of m_union.a is modified by m_union.b






二. 各個型態宣告所佔的記憶體大小

在研究上半部分的同時另外發現了long這個型態在32bit與64bit電腦上宣告所佔的記憶體大小是不相同的(不同的地方我用Bold顯示)。

32bit:
    long size is 4
    char size is 1
    unsigned long size is 4
    int size is 4
    float size is 4
    double size is 8


64bit:
    long size is 8
    char size is 1
    unsigned long size is 8
    int size is 4
    float size is 4
    double size is 8








沒有留言:

張貼留言