簡體   English   中英

struct {...}和struct {union {struct {...}}}之間有什么區別?

[英]What's the difference between struct { … } and struct { union { struct { … } } }?

DISK_DETECTION_INFO定義為是否有原因

typedef struct _DISK_DETECTION_INFO {
  DWORD          SizeOfDetectInfo;
  DETECTION_TYPE DetectionType;
  union {
    struct {
      DISK_INT13_INFO    Int13;
      DISK_EX_INT13_INFO ExInt13;
    };
  };
} DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;

代替

typedef struct _DISK_DETECTION_INFO {
  DWORD          SizeOfDetectInfo;
  DETECTION_TYPE DetectionType;
  DISK_INT13_INFO    Int13;
  DISK_EX_INT13_INFO ExInt13;
} DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;

或者我只是過度分析這段代碼?

可以說,這是一個錯誤。 但是,我們可能只給出了結構的公共定義。 在內部(當由Windows內核使用時),它可以定義為:

typedef struct _DISK_DETECTION_INFO {
  DWORD          SizeOfDetectInfo;
  DETECTION_TYPE DetectionType;
  union {
    struct {
      DISK_INT13_INFO    Int13;
      DISK_EX_INT13_INFO ExInt13;
    };
    DISK_INTERNAL_INFO   Private; // Used internally, when DetectionType = -1
  };
} DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;

我不會將其作為可維護,安全或便攜的志願服務,但這是可能的

DISK_INTERNAL_INFO甚至可能超過匿名struct的大小 - 假設用戶從不實例化對象本身,該技術甚至可能被認為有用於將額外數據隱藏在用戶之外但保留結構。 他們永遠不會“看到”過去的匿名struct

行為之間存在非常明顯的差異:在第一種情況下,當初始化DISK_DETECTION_INFO時, Int13ExtInt13 DISK_DETECTION_INFO初始化。 在后一種情況下,所有四個字段都被初始化。

MSVC有一系列古怪的擴展,包括結構末尾的可變大小的數組,其自動初始化行為可能是不合需要的。

編輯:關於“初始化”:

讓我們說結構是

typedef struct _foo {
  int bar;
  union {
    struct {
      int baz;
      int wee;
    };
  };
} foo;

然后,寫foo x = { 1; } foo x = { 1; }沒有為baz或wee賦值(它們在技術上是不確定的)。 如果結構是

typedef struct _foo {
  int bar;
  int baz;
  int wee;
} foo;

然后,寫foo x = { 1; } foo x = { 1; }不分配巴茲= 0和凌晨= 0

我認為有合理的證據表明有人在編寫原始的DISK_DETECTION_INFO結構定義時犯了一個簡單的錯誤。 這個錯誤逃到了野外,所以修復它已經太晚了。

頭文件中的定義是:

typedef struct _DISK_DETECTION_INFO {
        DWORD SizeOfDetectInfo;
        DETECTION_TYPE DetectionType;
        union {
                struct {

                        //
                        // If DetectionType == DETECTION_INT13 then we have just the Int13
                        // information.
                        //

                        DISK_INT13_INFO Int13;

                        //
                        // If DetectionType == DETECTION_EX_INT13, then we have the
                        // extended int 13 information.
                        //

                        DISK_EX_INT13_INFO ExInt13;     // If DetectionType == DetectExInt13
                } DUMMYSTRUCTNAME;
        } DUMMYUNIONNAME;
} DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;

文件內容如下:

如果DetectionType是DetectInt13,則union是DISK_INT13_ INFO結構。

如果DetectionType是DetectExInt13,則union是DISK_EX_ INT13_INFO結構。

因此,最初的意圖似乎很可能是將DISK_INT13_INFODISK_EX_INT13_INFO放在一個聯合中,因為它們是互斥的。

當一組字段具有互斥訪問權限時,Union通常用於節省空間。 也就是說,當一個活躍時,另一個活動不能。 與為所有字段分配空間相反,空間僅分配給最大的空間。 該空間可與其他領域互換使用。 如鏈接中所述,取決於DetectionType字段,它是Int13或ExInt13是活動的。 兩者都使用相同的分配空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM