c - 枚举存储在哪里



结构具有逻辑存在,并在定义结构变量时生效。我想知道枚举是如何存储的,它们在声明后立即进入生活。它只是一个合乎逻辑的存在吗?

#include<stdio.h>
enum tag{
a,
b};
struct tag1 {
int temp;
}var;
int main(){
int a=9;
printf("%d %dn",a,b);
printf("%dn",var.temp);
}

我听说枚举不存储在内存中,所以我的问题是 b 从哪里获得它的值。

标准枚举通常实现为 int32,

编译器会将您的枚举作为 int32 的同义词处理。为枚举创建值列表后,这些值将存储为其显示名称(声明枚举时给出的访问名称(的文本。因此,您的枚举在末尾是一个 int32,它像常量一样硬编码到内存中。

b

编译过程中被替换为其值(在您的情况下为 1(。因此,它将以与常量相同的方式处理,并且不可能像变量一样获取其地址。

我建议您查看对象N1570 3.15对象的定义:

执行环境中数据存储的区域,内容 可以表示值

常数 6.4.4 (p2(:

每个常量都有一个类型,由其形式和值确定,如 稍后详述

因此,

如果常量需要在执行环境中存储,因此可能仅在编译时存在,则未指定。

由于enumeration constantconstant因此也没有为它们指定。 例如,字符串文字放在.rodata部分中,因此可以读取,但修改它很可能会SEGV(尽管它是 UB(。

更具体地说,让我们尝试查看示例中的.rodata部分。这是objdump -dj .rodata bin_name

Disassembly of section .rodata:
0000000000000720 <_IO_stdin_used>:
 720:   01 00 02 00 25 64 20 25 64 0a 00 25 64 0a 00        ....%d %d..%d..

如您所见,它包含唯一的字符串文字。

枚举常量是值。它们的行为类似于其他整数值,例如 3 或 −87。编译器根据需要将它们构建到代码中:它们可以编码为指令中的直接操作数,从编译器用于保存常量的内存加载,或者内置到在编译时部分或完全计算的表达式中。

值在 C 的抽象计算模型中没有任何生存期。只有对象具有生存期,值不是对象。(对象是内存中用于表示值的保留部分。

最新更新