[英]The memory address of constants in C
我正在学习 C 中的指针,但我有几个问题。 这是一段代码,仅作为示例。
int var = 300;
char s[] = "Clang";
char *p = "Wonder";
我知道所有变量在内存中都有它们的地址。 var
、 s
和p
等变量在内存中都有自己的地址。
但我想知道常量是否也有内存地址。
300
, "Clang"
, "Wonder"
自己有内存地址吗?
变量和常量的内存使用是编译器实现的问题。 在实践中,常量定义如下:
const *foo = "bar";
const int answer = 42;
通常会占用内存并有地址。 也就是说,在运行时程序地址空间中的某个位置,您将找到表示文本“bar”的字节序列和表示数字 42 的字节序列。
然而,由于现代编译器进行了激进的优化,一些常量可能根本没有运行时存在是合理的。 例如,在这样的片段中:
const int foo = 3;
int x = foo * 4;
可以想象,如果foo
从未在其他任何地方使用过,编译器可能(实际上)将其转换为:
int x = 12;
并且foo
在运行时甚至不存在。
顺便说一句,许多开发人员将 C 预处理器宏视为“常量”:
#define PI 3.14159
这些通常在运行时不占用内存,因为它们在编译时被替换到代码中。
只有对象和函数在 C 中有地址。命名变量是对象。 字符串文字"Wonder"
本身是一个对象,一个由 7 个字符组成的数组(即char[7]
)——6 个可见字符和终止的空字符——因此可能有一个地址。 文字"Clang"
在这里是一个边界情况,严格来说它没有地址,因为它不是一个对象而只是一个特殊的初始化语法。
C 模型与 Python 编程语言非常不同,其中
a = 300
a
是一个没有地址的名字,而300
是一个有地址的对象。
这可能是因为虽然 C 说对象或函数有地址,但许多编译器优化代码,创建不遵循严格的 C 抽象机的可执行文件; 因此,一个对象可能只有在您观察它时才有地址。
大多数实现将对象放在通常称为 .text(代码)的“部分”中,.data - 初始化数据,.bss - 归零数据,.rodata - 只读数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.