C中常量的内存地址
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;
一般都会占内存,有地址。也就是说,在程序地址 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 - 只读数据的“部分”中。
我正在学习 C 中的指针,我有几个问题。 这里有一段代码只是为了示例。
int var = 300;
char s[] = "Clang";
char *p = "Wonder";
我知道所有变量在内存中都有它们的地址。
var
和 s
和 p
等变量在内存中有自己的地址。
但我想知道常量是否也有内存地址。
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 - 只读数据的“部分”中。