一 C語言中枚舉所佔多少字節呢?
這個問題最近一個項目中,遇到了才進行總結。看來很多問題,踩坑了才知道珍惜啊。
二 實例解析
#include <stdio.h> typedef enum { IIR_TYPE_LOW_SHELF = 0, IIR_TYPE_PEAK, IIR_TYPE_HIGH_SHELF, IIR_TYPE_LOW_PASS, IIR_TYPE_HIGH_PASS, IIR_TYPE_NUM } IIR_TYPE_T; typedef enum { IIR1_TYPE_LOW_SHELF = 0xfffffffff, IIR1_TYPE_PEAK, IIR1_TYPE_HIGH_SHELF, IIR1_TYPE_LOW_PASS, IIR1_TYPE_HIGH_PASS, IIR1_TYPE_NUM } IIR1_TYPE_T; int main() { printf("sizeof IIR ENUM is:%d \n\r",sizeof(IIR_TYPE_T)); printf("sizeof IIR ENUM1 is:%d \n\r",sizeof(IIR1_TYPE_T)); return 0; }
結果:
➜ enum_test git:(master) ✗ ./test sizeof IIR ENUM is:4 sizeof IIR ENUM1 is:8
三 總結
A 枚舉的大小是按照enum中元素最大值所佔的內存大小來決定的,不像結構體那樣有多少個元素就按各個元素所佔字節疊加。
B 當枚舉成員的值小於4個字節時,佔4個字節。
C 當枚舉成員的值大於4個字節時,最大隻能是longlong類型,佔8個字節。
可見枚舉類型的大小會隨着其中的元素的大小而發生變化,雖然幾乎沒有人會用這麼大的數來作爲枚舉,但起碼我們得知道枚舉類型字節數的大小是有可能發生改變的,所以到程序中有數據需要和別的程序進行交流,譬如上位機和下位機的通信數據,就儘量不要在數據包中包含有枚舉類型,以免發生歧義。