如何解决C中常量的内存地址
我正在学习C语言中的指针,并且有几个问题。 这是一个示例代码。
function getLastPathSegment($url) {
$path = parse_url($url,PHP_URL_PATH); // to get the path from a whole URL
$pathTrimmed = trim($path,'/'); // normalise with no leading or trailing slash
$pathTokens = explode('/',$pathTrimmed); // get segments delimited by a slash
if (substr($path,-1) !== '/') {
array_pop($pathTokens);
}
return end($pathTokens); // get the last segment
}
echo getLastPathSegment($_SERVER['REQUEST_URI']); //9393903
我知道所有变量在内存中都有它们的地址。
像int var = 300;
char s[] = "Clang";
char *p = "Wonder";
和var
以及s
这样的变量在内存中都有自己的地址。
但是我想知道常量是否也有内存地址。
p
,300
,"Clang"
本身是否有内存地址?
解决方法
变量和常量的内存使用情况是编译器实现的问题。实际上,常量的定义如下:
date color users ratio
0 2020-01-01 blue 100 1.00
1 2020-01-02 blue 102 1.02
2 2020-01-03 blue 104 1.04
3 2020-01-04 blue 98 0.98
4 2020-01-02 red 100 1.00
5 2020-01-03 red 107 1.07
6 2020-01-04 red 114 1.14
7 2020-01-05 red 150 1.50
通常将占用内存并具有地址。也就是说,在运行时程序的地址空间中的某个位置,您会找到代表文本“ bar”的字节序列和代表数字42的字节序列。
但是,由于现代编译器进行了积极的优化,因此某些常量可能根本没有运行时存在是合理的。例如,在这样的代码段中:
const *foo = "bar";
const int answer = 42;
可以想象,如果const int foo = 3;
int x = foo * 4;
从未在其他任何地方使用,则编译器可能(实际上)将其转换为:
foo
和int x = 12;
在运行时甚至都不存在。
偶然地,许多开发人员将C预处理器宏视为“常量”:
foo
这些通常在运行时不占用内存,因为它们在编译时被替换为代码。
,只有对象和函数在C中有地址。命名变量是对象。字符串文字"Wonder"
本身就是一个对象,由7个字符组成的数组(即char[7]
)(包括6个可见字符和终止的空字符),因此可以有一个地址。文字"Clang"
在这里是一个临界情况,严格来说,它没有地址,因为它不是对象,而只是特殊的初始化语法。
C模型与Python编程语言完全不同,其中
a = 300
a
是一个没有地址的名称,而300
是一个有地址的对象。
可能是因为尽管C表示对象或函数具有地址,但许多编译器都会优化代码,从而创建了不遵循严格的C抽象机的可执行文件。因此,只有当您观察对象时,它才可能具有地址。
,大多数实现将对象放置在通常称为.text(代码)、. data初始化数据,.bss-归零数据,.rodata-只读数据的“节”中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。