C中常量的内存地址

The memory address of constants in C

我正在学习 C 中的指针,我有几个问题。 这里有一段代码只是为了示例。

int var = 300;
char s[] = "Clang";
char *p  = "Wonder";

我知道所有变量在内存中都有它们的地址。 varsp 等变量在内存中有自己的地址。

但我想知道常量是否也有内存地址。

300"Clang""Wonder"本身有内存地址吗?

变量和常量的内存使用是编译器实现的问题。实际上,常量定义如下:

const *foo = "bar";
const int answer = 42;

一般都会占内存,有地址。也就是说,在程序地址 space 的某个地方 run-time 你会发现表示文本“bar”的字节序列和表示数字 42.

的字节序列

然而,由于现代编译器进行了积极的优化,一些常量可能根本 run-time 不存在是合理的。例如,在这样的片段中:

const int foo = 3;
int x = foo * 4;

可以想象,如果 foo 从未在其他任何地方使用过,编译器可能(实际上)将其转换为:

int x = 12;

foo甚至在运行时都不存在。

顺便说一句,许多开发人员将 C pre-processor 宏视为“常量”:

#define PI 3.14159

这些通常不会在 run-time 占用内存,因为它们在编译时被替换到代码中。

只有对象和函数在 C 中有地址。命名变量是对象。字符串文字 "Wonder" 本身是一个对象,一个 7 个字符的数组(即 char[7])——6 个可见字符和终止空字符——因此可能有一个地址。文字 "Clang" 在这里是一种边界情况,严格来说它没有地址,因为它不是对象而只是一种特殊的初始化语法。

C 模型与 Python 编程语言完全不同,

a = 300

a 是没有地址的名称,而 300 是有地址的对象。

可能是因为虽然C说一个对象或函数有一个地址,但许多编译器优化代码,创建一个不遵循严格的C抽象机的可执行文件;因此,一个对象可能只有在您观察到它时才有地址。

大多数实现将对象放在通常称为 .text(代码)、.data - 初始化数据、.bss - 归零数据、.rodata - 只读数据的“部分”中。