C中枚举值的内存位置

olo*_*ovb 13 c memory pointers

我想我已经在某处读过,在C中取一个枚举值的地址是非法的(枚举值不是左值;但是,我现在找不到任何关于此的信息).这是正确的,如果是的话,为什么?


编辑:

这是一个例子,用上面的"枚举值"来澄清我的意思.我的意思是取first_value下面的地址,而不是获取枚举的实际实例的地址:

enum myenum
{
    first_value,
    second_value
};
Run Code Online (Sandbox Code Playgroud)

Mar*_*n B 27

"枚举值"略显含糊; 但是,我认为你的意思是:

enum myenum
{
    first_value,
    second_value
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,取地址是违法的first_value.这样做的原因是first_value内存中实际上并不存在......它只是一个常数,实际上是数字0的另一个名称(当然,你也不能取地址).

另一方面,如果你的意思是你是否可以获取声明为枚举的变量的地址:

enum myenum x;
enum myenum *mypointer=&x;
Run Code Online (Sandbox Code Playgroud)

那绝对是可能的.

  • 我想,每个人都得到了SO的奇迹. (2认同)

小智 18

如果你有:

enum E {
    X, Y, Z
};
Run Code Online (Sandbox Code Playgroud)

那么你不能取X,Y或Z的地址,只能取0,1或2的地址.

但是,您可以获取枚举实例的地址:

typedef enum  {
   X, Y, Z
} E;

int main() {
  E e;
  E * ep;
  ep = & e;
}
Run Code Online (Sandbox Code Playgroud)


Bas*_*ard 10

枚举用于替换#define链:

#define SUCCESS 0
#define LITTLE_ERROR 1
#define BIG_ERROR 2
Run Code Online (Sandbox Code Playgroud)

这可以替换为:

enum
{
    SUCCESS,
    LITTLE_ERROR,
    BIG_ERROR
};
Run Code Online (Sandbox Code Playgroud)

枚举值,例如SUCCESS仅仅是整数常量的符号,不会存储在程序存储器的任何位置.因此,取其地址是没有意义的.


cha*_*aos 5

枚举的值名称只是整数的常量别名,因此尝试获取其地址是没有意义的.当然,您可以将枚举变量的地址设置得很好.