C語言列舉型別所佔位元組大小例項解析

虚生發表於2024-05-18

一 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個位元組。

可見列舉型別的大小會隨著其中的元素的大小而發生變化,雖然幾乎沒有人會用這麼大的數來作為列舉,但起碼我們得知道列舉型別位元組數的大小是有可能發生改變的,所以到程式中有資料需要和別的程式進行交流,譬如上位機和下位機的通訊資料,就儘量不要在資料包中包含有列舉型別,以免發生歧義。

相關文章