我写的一个测试,打印内容的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] 代表 程序参数.

  • 参数 argcargv 和弦指出,由 argv 阵列应 被修改的通过程序,并保留他们的最后储存的价值观之间的程序 启动和程序的终止。

最后一颗子弹是最有趣的对 哪里 串的论点过来 main 被存储。他们必须可修改的,他们必须有静态的程度上,这地方一定的限制,他们驻留在记忆。有没有要求的语言的一部分的定义,他们居住在相同的位置每次运行程序,虽然。

我已经做了一个粗略的通过搜索MSDN看如果他们说什么明确,但没有发现任何东西呢。它可能涉及到ASLR中提到的评论意见。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top