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








2015年2月26日 星期四

在Asus筆電A42JV上遇到ndis.sys的藍白畫面

昨天晚上回家,電腦一開機當進入到登入畫面時,電腦隨即出現藍白畫面如下圖所示


後來上網查了一些資料,找到了一些蛛絲馬跡。

似乎是因為Win7(64位元)自動更新了錯誤的Atheros AR9285驅動程式所造成的。


Solution:
再開機的時候進入安全模式(不要選包含網路與命令提示,若是無安全模式選單試試"F8"),進
入win7之後,到控制台的裝置管理員更新驅動程式。





更新完成後重開機,就不會有ndis.sys 藍白畫面的問題了。

Atheros AR9285 (Win7_64bit)驅動程式載點(2.4MB):
https://www.dropbox.com/s/dpan2xdh1d3kfzb/win7-10.0.0.297-whql.zip?dl=0