为什么该地址的主要功能的参数变化的各个时间?
-
25-09-2019 - |
题
我写的一个测试,打印内容的argv[0]--地址的主要功能的参数,如下:
printf("%p\n",argv[0]);
我编的程序与Visual Studio2008年Windows7。
然后我执行的程序的1000倍,其输出结果的文件。结果,地址argv[0]的变化,但是,有些地址是一样的和重复的大约10倍。
为什么该地址的主要功能的变化参数的每一个时间?
解决方案
有趣的问题,我看到在计划自己的地址空间的非确定性很少或根本没有理由。但我会告诉你我知道的。
首先,argv的分配,创建,而不是由窗口,但通过STDC运行时初始化。这反过来,引发了另一个问题 - 不WinMain函数的参数lpCmdLine也改变吗?还有就是在同一个堆上分配几个其他变量,可能是环境瓦尔也被复制。其中一人必须根据执行的实例有大小。
总之,为什么黑盒琢磨?哪里是你的反汇编,士兵?
其他提示
和argc
argv
应放置到堆栈之前开始二进制可执行的主程序的。实际上我认为argv
是动态分配的堆内的某处,然后将指针放置在堆栈中。
这意味着,堆分配器是关于对数据进行分配,这就是为什么它改变每次忧虑(这取决于政策)的一个..你的程序将要求操作系统分配的空间参数(考虑穿过malloc
)因此可以是内部的选择根据由东西(如他们正在谈论ASLR)
首先,这是什么语言标准(n1256)有的说:
5.1.2.2.1程序的启动
...
2如果他们宣布,本参数的主要功能,应当遵守以下 制约因素:
- 值
argc
应非负。
argv[argc]
应一个空的指针。
- 如果价值
argc
大于零,该阵列的成员argv[0]
通过argv[argc-1]
包容性应当含有指针串,这是给予 执行情况定义的价值观的主机环境的现有程序的启动。的 意图是提供的节目信息之前确定程序的启动 从其他地方在托管环境。如果主机环境中是不能够 供应字字母大写和小写的,执行情况 应确保符收到在小写。
- 如果价值
argc
大于零,串指出,由argv[0]
代表 节目的名字;argv[0][0]
应该null character如果 节目的名称是不可自主的环境。如果价值argc
是 大于一,符指出,由argv[1]
通过argv[argc-1]
代表 程序参数.
- 参数
argc
和argv
和弦指出,由argv
阵列应 被修改的通过程序,并保留他们的最后储存的价值观之间的程序 启动和程序的终止。
最后一颗子弹是最有趣的对 哪里 串的论点过来 main
被存储。他们必须可修改的,他们必须有静态的程度上,这地方一定的限制,他们驻留在记忆。有没有要求的语言的一部分的定义,他们居住在相同的位置每次运行程序,虽然。
我已经做了一个粗略的通过搜索MSDN看如果他们说什么明确,但没有发现任何东西呢。它可能涉及到ASLR中提到的评论意见。
不隶属于 StackOverflow