【问题标题】:Memory location of enum value in CC中枚举值的内存位置
【发布时间】:2010-11-15 10:46:01
【问题描述】:

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


编辑:

这是一个示例,阐明了我上面所说的“枚举值”的含义。我的意思是取下面first_value 的地址,而不是取枚举的实际实例的地址:

enum myenum
{
    first_value,
    second_value
};

【问题讨论】:

  • 那个枚举只存在于编译器的内存中,不存在于可执行文件中。您必须创建一个枚举实例,它才能出现在可执行文件中。

标签: c memory pointers


【解决方案1】:

“枚举值”略有歧义;但是,我假设您的意思如下:

enum myenum
{
    first_value,
    second_value
};

在这种情况下,取first_value的地址是非法的。原因是first_value 实际上并不存在于内存中的任何地方……它只是一个常数,实际上是数字 0 的另一个名称(当然,您也不能取其地址)。

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

enum myenum x;
enum myenum *mypointer=&x;

那么这绝对是可能的。

【讨论】:

  • 这里的重要一点似乎是,整数不像变量那样存在于内存中。那么无法获得它的地址就很有意义了。
  • 枚举是像 const 变量一样存储在 ROM 中还是存储在 RAM 中?
【解决方案2】:

如果你有:

enum E {
    X, Y, Z
};

那么你不能取 X、Y 或 Z 的地址,就像你不能取 0、1 或 2 的地址一样。

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

typedef enum  {
   X, Y, Z
} E;

int main() {
  E e;
  E * ep;
  ep = & e;
}

【讨论】:

    【解决方案3】:

    枚举用于替换#define链:

    #define SUCCESS 0
    #define LITTLE_ERROR 1
    #define BIG_ERROR 2
    

    这可以替换为:

    enum
    {
        SUCCESS,
        LITTLE_ERROR,
        BIG_ERROR
    };
    

    SUCCESS 这样的枚举值只是一个整数常量的符号,它不会存储在程序内存的任何地方。因此,获取它的地址是没有意义的。

    【讨论】:

      【解决方案4】:

      枚举的值名称只是整数的常量别名,因此尝试获取它们的地址是没有意义的。当然,你可以取一个枚举变量的地址就好了。

      【讨论】:

      • 枚举值是常量,但它们不是宏。在大多数方面,它们当然与使用宏定义的常量类似,但它们在一些细微的方面有所不同——例如,它们受范围限制,而宏则没有。
      • 它们当然不是#defines 或宏。您可能需要重新措辞。
      • 是的,耶稣,我严重低估了我会遇到的迂腐。 Mea maxima effing 过失。现在好多了。
      • 好的。我想“有效”和“出于所有可能的目的”之间的区别除了我之外没有任何人。
      • @MakhloufGharbi 它们根本不存在于运行时程序的内存中。它们是编译器/预处理器工件。
      【解决方案5】:

      请参考以下示例:

      enum { FIRST,SECOND } var;
      

      这里FIRSTSECOND 是常量宏。因此& 运算符将不起作用,因为它没有存储在内存中的任何位置

      但是对于var,将分配一个内存位置,并且可以使用& 运算符。

      【讨论】:

        【解决方案6】:

        据我所知,C 中的枚举只是整数。 所以它就像指向局部变量一样。

        【讨论】:

        • 指向局部变量的指针在 C 中是完全有效的。
        • 不错,很久没用C了投反对票
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-21
        • 2011-04-26
        • 1970-01-01
        • 1970-01-01
        • 2011-11-04
        • 2010-11-26
        相关资源
        最近更新 更多