首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++ 静态变量的内存地址,在程序编译为exe的时分就固定了 是么

2014-01-14 
C++ 静态变量的内存地址,在程序编译为exe的时候就固定了 是么?本帖最后由 oXiFangShiBai 于 2013-04-29 01

C++ 静态变量的内存地址,在程序编译为exe的时候就固定了 是么?
本帖最后由 oXiFangShiBai 于 2013-04-29 01:40:40 编辑
最近在看[C++ P*  P* 第六版] *表示通配符

我以前认为, exe的文件,在不同的电脑,不同的时间,运行,某个变量的内存地址应该是不同的,就好像我去住旅馆,早上去,下午去, 或者去其他城市,根本不可能住在和以前一模一样的房间里,因为可能房子早已经被人家租了,我认为内存也是如此, 看我什么时候入驻的,那么我的房号就是多少, 比如我的第10个入驻的,房号就不可能是9,因为9被人家住了

但是看了这本书,似乎感觉, 内存 在程序编译为exe的时候就固定了

然后我又想起以前研究外挂的时候,所谓的基址,这个基址居然是通用的,那是否证明,编译为exe的时候,某个变量的地址 就已经固定好了呢?

某些破解软件,是不是也是直接去操作这个固定的内存地址,达到破解的呢?

求帮助,求通俗语言讲解,


问题1:C++ 静态变量的内存地址,在程序编译为exe的时候就固定了 是么?
问题2:普通变量是不是在编译为exe就固定了,而new 出来的地址 是在程序运行中创建的?
问题3:你觉得我还需要了解什么知识? C++ 内存
[解决办法]
1、没研究过,认为是固定的;
2、栈上的东西是调用时才通过移动栈顶指针实现的,不能算固定,但是对栈的相对偏移肯定是编译器一次优化了的,堆的就运行时确定了;
3、了解80x86处理器的运行模式,了解下什么是物理地址,什么是线性地址,就不会有那么多困惑了。
[解决办法]
1. 是的

2. 局部变量可以认为是地址是固定的。c不支持变长数组,一次编译,多次运行都会得到一个相同的地址。但是重新编译就可能得到完全不同的地址。

3.堆是动态分配的,出现不同的地址很正常

4.OS的内存管理,《程序员的自身修养--编译、连接与库》
[解决办法]
exe的格式不一样,操作系统不一样,这个问题完全没有意义啊。
[解决办法]
问题1:如果在EXE编译的时候就固定了,那么这个内存地址被别的程序占有了,然后再加载,他还是这个地址么?所以不是在exe编译时固定,而是在程序一开始运行的时候就分配的。
问题2:普通变量是在栈上面创建了,而栈是在程序运行时才分配的,new出来的地址是在程序运行时才创建的。
问题3:还要了解操作系统的知识。
[解决办法]
现代OS和程序,应该都是逻辑地址,怎么可能在编译成exe文件时就固定???
通俗的说,你这个exe在不同的电脑上运行,运行环境都不一样,怎么能是同一个地址呢
A电脑只有1G内存,可以运行你的exe,
B电脑4G或者更多内存,可以运行更多个exe程序,每个exe里的变量地址显然不同吧
但是同一个exe文件一单编译好,变量的逻辑地址是固定的(动态申请的除外)。

你需要了解下程序从编译到运行的过程,了解程序装入方式,还有就是操作系统原理,逻辑地址到物理地址的映射(地址变换机制等)。

[解决办法]
OS的页式存储也段式存储机制是否很清楚呢?他们都是基于离散内存分配下的机制。这里涉及到的是基于分段式存储,段是一个逻辑概念,你的程序被编译器编译好后会生成一个段表,段表的首地址是0,程序中的变量,代码等在段中的相对地址是固定的了。段表是由OS实现的从逻辑地址到物理地址的转换。
[解决办法]
C++ 静态变量的内存是在全局静态区分配的, 从程序运行到开始到结束时不会变化的,至于说在程序编译为exe的时候就固定了的说法是错误的!
[解决办法]
都是逻辑地址,经过偏移过的,跟实际地址貌似不是一回事吧。在编译的时候固定,是说的逻辑地址固定,实际地址不会固定的。
[解决办法]
只是正常情况下同一个exe里的静态存储区位置总是固定的。实际上可执行文件格式是支持每次执行的时候静态存储区位置不固定,只不过一般的保护模式操作系统(比如Windows Linux)不会这么干,只有可执行文件被作为动态连接库使用的时候才会动态分配静态存储区。而非保护模式的操作系统静态存储区一般就没办法有固定地址,因为所有运行中的东西共享同一块内存,比如DOS里可执行程序加载在哪儿要看驻留内存的东西已经把内存用到哪儿了。
[解决办法]
《程序员的自我修养——链接、装载与库》
《Windows PE权威指南》
[解决办法]
相对于程序(exe、dll)加载的起始地址是固定的,但是不能保证每次加载/在不同的系统上加载时,静态变量的地址(逻辑地址)都固定,因为操作系统的加载过程可能对其重定位到不同的起始地址。
至于其在物理内存中的地址,运行时都有可能改变。

[解决办法]

引用:
问题1:如果在EXE编译的时候就固定了,那么这个内存地址被别的程序占有了,然后再加载,他还是这个地址么?所以不是在exe编译时固定,而是在程序一开始运行的时候就分配的。
问题2:普通变量是在栈上面创建了,而栈是在程序运行时才分配的,new出来的地址是在程序运行时才创建的。
问题3:还要了解操作系统的知识。


这个才是正确的

热点排行