簡體   English   中英

sizeof運算符如何用於結構

[英]How sizeof operator works for a structure

我正在閱讀K&R。 在一個示例中,它將結構數組定義為:

struct key {
char * word;
int count;
} keytab[] = {
   "auto", 0,
   "break", 0,
   /*more members*/
   "while", 0
};

然后,要計算數組的大小,它使用兩種方法:

1) #define NKEYS (sizeof keytab/ sizeof(struct key))
2) #define NKEYS (sizeof keytab/ sizeof keytab[0])

然后,它說第二種方法的優點是,如果類型更改,則無需更改。 有人可以告訴我最后一行的含義嗎? 在這里談論什么優勢?

如果將來您將keytab數組更改為與struct key不同的類型,則必須更改第一行sizeof,因為該類型是在此處明確寫入的。 第二行sizeof行將保持工作狀態,因為它沒有命名類型,而是采用數組元素的任何類型。

有人能告訴我最后一行的含義嗎?

真的很簡單。 當您聲明某物(任何東西)的數組時,每個元素都是該類型的sizeof (例如, int array[10] = {0};聲明並初始化一個由10個元素組成的int數組sizeof (int) 。該數組的每個元素都具有sizeof (int)

您可以使用array[x] (其中x為0-9 )訪問每個元素。 任何元素,例如array[0]都是一個int (就像*array是對第一個元素的引用一樣-其中array[0]只是指針表示法中的*(array + 0) ,當然,它只是*(array)*array ,因為括號是然后沒有必要)。

返回struct數組的大小。 sizeof keytab給出數組中字節的總數。 sizeof keytab[0]給出每個元素中的字節數。 因此sizeof keytab / sizeof keytab[0]是數組中元素的數量。 它與編寫sizeof keytab / sizeof *keytabsizeof keytab / sizeof (struct key)

為什么? 因為sizeof keytab[0]只是sizeof (struct key) 但是,如果您根據sizeof (struct key)確定元素的數量,然后更改類型,則所有具有sizeof (struct key)代碼都會出錯,但是如果您使用sizeof keytab[0]尺寸設置,您的代碼將繼續具有正確數量的元素,因為您是根據sizeof "an element"而不是sizeof (an arbitrary type name)

對於1),代碼需要假定我們正在查看struct key類型的成員數組。
對於2),代碼不需要知道這一點。

出於可維護性的原因,這被認為是2)的優勢。
考慮幾個在項目上工作的人,一個將數組的定義更改為

struct key2 {    
    char * word;
    int count;
    int coolness;    
} keytab[] = /* ... */

並將struct key的定義與其他地方分開,與您的代碼相同。 另一個負責帶有size宏定義的代碼部分。

然后1)變成錯誤,但2)保持正確。
因此1)將需要兩個開發人員之間進行額外的同步,這意味着需要付出額外的努力並有出錯的風險。

有人可以告訴我最后一行的含義嗎?

使用struct key類型獲取數組元素的實際數量

在這里談論什么優勢?

除了不明確依賴某種類型的優勢外,

編譯器可以使用實際定義對宏進行更多優化。 sizeof(type)相比, sizeof(var)優化效果更好。

暫無
暫無

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

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