请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

请问老师关于内存地址是怎么生成的

比如有一条语句:
  char* str = “abc”;
通过visual studio我能知道他的汇编大概长这样:
  00AYYYYY mov dword ptr [str], offset string “abc” (0AXXXXXX)

如果我没理解错的话,这条汇编的意思应该是把常量区0AXXXXXX的值(abc)赋值给了常量区的str这个地址吧?
但是我想知道这个常量区的地址是谁来生成的呢?是c++的编译器么?如果是的话,那编译器是怎么知道哪块儿的地址属于常量区,哪些地址又不是常量区呢?

然后还有个问题,编译器是怎么把变量名和实际地址对应上的呢?就比如上面那个 str 变量,假设它在内存里的地址是 0x00acXXXX, 这个地址的值存了 “abc”,那之后比如我要 cout << str; 用到了这个 str 变量时候,为啥编译器就知道要去找 0x00acXXXX 这个地址呀?
谢谢老师。

正在回答

1回答

常量区的地址在编译过程中生成可执行文件时会有专门的区域存放;编译器在生成变量是,对每一个变量会记录两个信息:一个是变量的位置,一个是变量的类型信息;所以能容易的找到和译码信息。

0 回复 有任何疑惑可以回复我~
  • 提问者 Osuribaba #1
    再请问一下,编译器在记录变量的位置和类型信息的时候,比如 char str 这个变量,编译器把 str的位置记录下来了,char类型也记录下来了,那编译器对于“str”这个变量本身是怎么记录的?或者说编译器是怎么处理“str”这三个字母的?
    回复 有任何疑惑可以回复我~ 2020-03-22 15:41:51
  • 提问者 Osuribaba #2
    或者说,对于“str”这三个字母和内存当中的那个位置,编译器是怎么把这俩东西建立起映射关系的?是编译器内部对变量名和位置做了张映射表之类的,还是什么其他的方法?
    回复 有任何疑惑可以回复我~ 2020-03-22 15:45:26
  • quickzhao 回复 提问者 Osuribaba #3
    常量的信息在编译生成可执行文件时以格式化区块的方式保存在可执行文件中固定的相对位置。如果要了解细节,在Windows下可以去学习pe文件格式。
    回复 有任何疑惑可以回复我~ 2020-03-22 16:11:04
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信