突发奇想,想测试一下main函数参数的内存分布,代码如下:
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
int pNumArgs=0;
LPTSTR lpCmdLine=NULL;
LPWSTR* szArglist=NULL;
lpCmdLine=GetCommandLineW();
szArglist=CommandLineToArgvW(lpCmdLine, &pNumArgs);
return 0;
}
在属性中设置命令行参数为aaaaaaa bbbbbbb ccccccc,如下图
调试,szArglist值是0x00439888,内存串口中找到内存0x00439888处(这个地址不大,是在用户空间,非内核空间),如下图:
看内存很清晰:分2部分
第一部分:char*数组, 相当于argv[0] argv[1] argv[2] argv[3],并以空结束。
第二部分:对应的4个字符串,起始地址分别对应第一部分的几个值,以空结束。
从这个内存显示来看,第一部分、第二部分在内存中是连续存放的(可能是碰巧,也可能是微软故意这样安排的,Linux就不是这样)。
至于argv的值,也会有专门的位置存储,也是在栈中。如下图(图中显示不是同一次调试的结果):