2012-09-04 63 views
6

我正在嘗試使用C和Assembly(intelx8086)語言。Enum如何在C上分配內存?

我還使用一類我的一個朋友給我說,有一個

typedef enum data_10 {a=0,b=7,c=10,} data_10_type; 

我想這個類按位工作(AKA構建它/摧毀它的部件)。我的問題是,「enum」需要多少內存?

+1

在C中,與int相同。在C++ 0x中,它可以基於基本類型或多或少。 – DCoder

+0

[C中枚舉的大小是多少?](http://stackoverflow.com/questions/366017/what-is-the-size-of-an-enum-in-c) – DCoder

+0

[Wikipedia ](http://en.wikipedia.org/wiki/Data_structure_alignment#Typical_alignment_of_C_structs_on_x86)有一些與您的任務相關的信息。 – NovaDenizen

回答

1

枚舉並沒有真正記憶;編譯器會理解它,編譯期間會使用正確的數字。這是一個int,其大小取決於您的系統。

2

爲什麼不打印它?

/* C99 */ 
#include <stdio.h> 

typedef enum { a = 0, b = 7, c = 10 } data_10_type; 
printf("%zu\n", sizeof(data_10_type)); 

在枚舉列表中的標識符聲明爲具有類型intC11§6.7.2.2枚舉符)常數,因此sizeof(data_10_type)往往等於sizeof(int),但它是沒有必要的!

順便說一句,如果你想有一個位的大小,只需使用CHAR_BIT常量(定義在<limits.h>),這表明在一個字節中有多少位)。

/* C99 */ 
#include <limits.h> 
#include <stdio.h> 

typedef enum { a = 0, b = 7, c = 10 } data_10_type; 
printf("%zu\n", sizeof(data_10_type) * CHAR_BIT); 
+0

CHAR_BIT在哪些情況下與8不同? – Dirk

+3

該標準說'CHAR_BIT'大於8.例如,在DSP上,'CHAR_BIT'通常等於16. – md5

+2

@Dirk:不能保證CHAR_BIT將是8.歷史上,字節是6,7和8位。現代嵌入式系統可能具有不同的char大小(例如16位)。我們也不知道什麼樣的體系結構看起來像10年以上的樣子,所以最好不要假設(或者至少使用靜態斷言來安全地失敗)。 – sfstewman

6

雖然可能會發生變化,從編譯器的編譯器,enum通常需要大小爲int相同。但可以肯定的是,您始終可以使用sizeof(data_10_type);

+0

+1尺寸。這是唯一安全,便攜的知道方法。 – sfstewman

+0

這會告訴你一個體繫結構上一個編譯器的特定版本的大小。這不是面向未來的。 – NovaDenizen

+0

@NovaDenizen只有打印一次並永久使用。最好將它存儲在一個變量中,並使用它來進行分配。 – Greyson