繁体   English   中英

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;

通常会占用内存并有地址。 也就是说,在运行时程序地址空间中的某个位置,您将找到表示文本“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM