1)学习C\C++的是不需要研究这个问题的。这个问题不属于C\C++
2)如果楼主学过汇编知识,这个问题太简单了,属于必备知识。
3)如果楼主学过一段时间的 *** 作系统知识或PE文件格式问题,这个问题也是很容易找到答案的。
4)可目前而言,要透彻理解这个问题很难。时间久了,知识丰富了,就算不属于C\C++的知识范畴,楼主也会明白的。
5)可以简单理解为,这个好比在小格子文稿纸中写文章一样,假设每个小格子都有编号,你写了2个段落后。开始写第三段落时,要写的第一个字所在的小方格上肯定也会有个编号,楼主的问题就好比在问为什么第三段落的第一个字所在的小方格的编号为0x0012FF64原因很简单,一个一个排下来的。
6)写文章肯定是从第一个格子,一个一个写下来的,但与写文章不同的是,程序的地址分配不是连续的。它分为好多块,代码为一块,全局变量为一块,菜单资源、对话框、工具栏资源又归在一块等等很多内容。这样一来,就好比楼主写了篇文章,让编译器编译后,编译器把所有的动词全部归为一类,放在了第一段落,然后重启一行,归纳所有的名词。再归纳所有的形容词,以此类推。因此,如果楼主上手写的文章第一个字是“我”(名词),原来应该的地址为0x00000000,可实际被编译器安排到了exe文件中第二段落的第一个小格子里。这个小格子的地址究竟为多少,取决于第一段落里的动词的数量。编译器要把整篇文章所有的动词归纳到第一段后,“我”这个名词在第二段落第一个格子的编号才能被确定下来。(实际的编译器肯定不是这样工作的,但实现的结果就和这个差不多,后一段的地址总是要取决于前一个段落内容的多少而定)
7)当把exe文件从磁盘装到内存中时, *** 作系统不是按照磁盘上的地址顺序转入的,譬如exe文件第1,2个字为“开始”(动词)、“执行”(动词),但被装入内存后,地址往往(按照现有的任何 *** 作系统要求绝对不可能)不是0x00000000和0x00000001,而是0x00400000和0x00400001。
大致的情况就是如此了,不知道这样解释楼主是否明白了些,还是被我弄得一头雾水~
windows 32位 *** 作系统下,使用内存分页机制。每个进程都在自己虚拟的独立内存里。
而通用寄存器为32位,可以使用32根线性地址寻址。寻址的方式等于2的32次方。也就相当于4G左右。也就是说,每个进程只拥有4G左右的虚拟内存空间。
并且4G里有2G左右被系统使用,代码能用的就2G以内。地址范围是0x00400000到0x7FFFFFFF
你的实际内存大并不能增加1个进程可以使用的虚拟内存
可以用GlobalMemoryStatus()函数实现,示例:
#include <stdioh>
#include <Windowsh>
int main(int argc, char argv[])
{
MEMORYSTATUS memStatus;
GlobalMemoryStatus(&memStatus);
printf("%lu\n", memStatusdwTotalPhys / 1024 / 1024);//输出系统内存的总量
printf("%lu\n", memStatusdwAvailPhys / 1024 / 1024);//输出系统内存的当前可用量
return 0;
}
代码看了,没明白。
为什么在OpenProcess之后要马上结束它呢?至少要先读点什么吧,不明白用意何在。
还有一个明显错误,(LPCVOID)586090这个应该是(LPCVOID)0x586090
以上就是关于VC中的内存是如何分配的全部的内容,包括:VC中的内存是如何分配的、vc内存分配、vs编写的c语言程序有办法检测用了多少内存吗vc6.0也行。。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)