首页
社区
课程
招聘
[求助]对本书中关于常量解释的一些疑惑
发表于: 2013-10-13 21:55 23940

[求助]对本书中关于常量解释的一些疑惑

2013-10-13 21:55
23940
常量有地址么?
按照书上P29“常量没有地址(不包括const定义的伪常量)”
而在P36上说:“常量数据的地址减去基地址,便是它在文件中的偏移地址”
这两句是否矛盾呢?既然常量没有地址,那在文件中哪来的地址,还是说P36的常量指的是伪常量?
百度百科上的定义为:指在程序运行过程中,其值不可改变的量.与变量不同,常量没有名称,由于常量同样要存储,所以其有地址。

求解惑

另,
   "常量数据的地址减去基地址,便是在文件中的偏移地址"
这段话有点不知所云。一个程序经过像VC这种编译器编译后,
字符串常数通常是集中放在一个节内的,那么它所谓的“基地址”
又是什么东西?如果指的是节首地址,那两者的差也根本不是
文件内的偏移,只能算是节内偏移。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 503
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
char *p = "hello"

看一下p的地址。。

就知道了。。书上说的没错。。。
2013-10-13 22:19
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
P又不是常量
2013-10-13 22:38
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
而且2L,您到底是要表达哪种观点?
我是需要详细的理论解释
2013-10-13 22:40
0
雪    币: 200
活跃值: (38)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
我们假定你在讨论c中的全局constant 量

假设我们讨论 const int a = 1;

实际上constant只是约束代码不能修改这个量,并没有约束它到底能不能在内存中有槽。这里要综合考虑const volatile static extern连用的情况,

只const int a = 1,会分配内存“槽”,有内存地址。因为变量的符号要导出,最后链接可能会出现在只读数据段,不过肯定会在内存中有,不过你代码中如果使用这个量,那么编译器可能会直接优化,hardcode到用到那个量的代码中。

const  volatile int a = 1,会分配内存“槽”,有内存地址。代码每次用到的时候会从内存中读取变量,而不会直接hardcode。

const  static int a = 1,很大可能不会分配内存“槽”,也就是没有内存地址。毕竟符号不会导出。很大可能直接hardcode到代码中。

const static volatile a = 1,会有内存“槽”,有内存地址。不会优化为hardcode,但符号不会导出。

不过你要是直接取了变量的地址,比如&a,那么编译器就知道你的确要取地址,无论如何得给你一个“槽”

如果是extern的话,综上,你应该明白的。

如果你要讨论像 const char a[10] = "123456789",或者const struct a这种结构,基本可以确定他们是会被分配内存“槽”的,也就是有内存地址。
2013-10-13 23:34
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢你详细的解答~~。这么说,如果是const常量的话,是有地址的,如果是其他的,例如1,3,define之类的都是没有地址的么
2013-10-14 00:09
0
雪    币: 200
活跃值: (38)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
你仔细再看一下回复,在static情况下,const量不一定真正被分配内存。

define那个是宏,会在预处理阶段展开,不在讨论范围内。
2013-10-14 00:52
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
明白了,谢谢你
2013-10-14 08:28
0
雪    币: 25
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
后一句确实有问题,关于文件载入内存的过程这个事情,确实有很多说道,混到一起之后,更容易弄错。这本书没看过,所以没有上下文不好说什么意思。
2013-10-14 13:27
0
雪    币: 803
活跃值: (695)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
个人见解
书上P29“常量没有地址(不包括const定义的伪常量)”
是指在C++中无法对常量使用&, 进行取地址, 应该结合前文来看
如果对于二进制代码, 包括指令与数据, 肯定是有地址的
2013-10-14 20:50
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
谢谢大家~~~
2013-10-16 10:00
0
游客
登录 | 注册 方可回帖
返回
//