在哪个内存段命令行参数存储?

Pra*_*kar 6 c linux gcc

命令行参数argc,arv[]mainC中的函数一起使用,它们在哪里存储在内存中?

我正在寻找这个问题的存储区域应该是堆,数据段,堆栈或其他.

Jon*_*ler 1

正如torek在他的回答中所说,C语言没有定义命令行参数必须存储在哪里,并且知道没有太多实际用途。然而,信息通常存储在堆栈中。

\n\n

此代码也使用 的通用扩展来main()获取环境,然后打印参数和环境的地址。

\n\n
#include <stdio.h>\n#include <inttypes.h>\n\nint main(int argc, char **argv, char **envp)\n{\n    printf("&argc = 0x%.8" PRIXPTR "\\n", (uintptr_t)&argc);\n    printf("&argv = 0x%.8" PRIXPTR "\\n", (uintptr_t)&argv);\n    printf("&envp = 0x%.8" PRIXPTR "\\n", (uintptr_t)&envp);\n    while (*argv != 0)\n        printf("*argv = 0x%.8" PRIXPTR "\\n", (uintptr_t)*argv++);\n    while (*envp != 0)\n        printf("*envp = 0x%.8" PRIXPTR "\\n", (uintptr_t)*envp++);\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在我的 Mac 上运行时,显示:

\n\n
&argc = 0x7FFF5494B52C\n&argv = 0x7FFF5494B520\n&envp = 0x7FFF5494B518\n*argv = 0x7FFF5494B748\n*envp = 0x7FFF5494B74E\n*envp = 0x7FFF5494B839\n*envp = 0x7FFF5494B862\n*envp = 0x7FFF5494B86D\n*envp = 0x7FFF5494B889\n*envp = 0x7FFF5494B8C1\n*envp = 0x7FFF5494B8F4\n*envp = 0x7FFF5494B905\n*envp = 0x7FFF5494B915\n*envp = 0x7FFF5494B920\n*envp = 0x7FFF5494B92E\n*envp = 0x7FFF5494B93B\n*envp = 0x7FFF5494B974\n*envp = 0x7FFF5494B998\n*envp = 0x7FFF5494B9CD\n*envp = 0x7FFF5494B9F2\n*envp = 0x7FFF5494BA0B\n*envp = 0x7FFF5494BA2A\n*envp = 0x7FFF5494BA46\n*envp = 0x7FFF5494BA7B\n*envp = 0x7FFF5494BB2E\n*envp = 0x7FFF5494BB3C\n*envp = 0x7FFF5494BB76\n*envp = 0x7FFF5494BB87\n*envp = 0x7FFF5494BB9D\n*envp = 0x7FFF5494BBC8\n*envp = 0x7FFF5494BBEA\n*envp = 0x7FFF5494BC2B\n*envp = 0x7FFF5494BC35\n*envp = 0x7FFF5494BC51\n*envp = 0x7FFF5494BC5F\n*envp = 0x7FFF5494BC75\n*envp = 0x7FFF5494BC82\n*envp = 0x7FFF5494BD55\n*envp = 0x7FFF5494BD7E\n*envp = 0x7FFF5494BD96\n*envp = 0x7FFF5494BDA3\n*envp = 0x7FFF5494BDAE\n*envp = 0x7FFF5494BDBF\n*envp = 0x7FFF5494BDCA\n*envp = 0x7FFF5494BDE8\n*envp = 0x7FFF5494BE01\n*envp = 0x7FFF5494BE09\n*envp = 0x7FFF5494BE1E\n*envp = 0x7FFF5494BE38\n*envp = 0x7FFF5494BE52\n*envp = 0x7FFF5494BE71\n*envp = 0x7FFF5494BE7D\n*envp = 0x7FFF5494BEF5\n*envp = 0x7FFF5494BF16\n*envp = 0x7FFF5494BF27\n*envp = 0x7FFF5494BF32\n*envp = 0x7FFF5494BF66\n*envp = 0x7FFF5494BF8D\n
Run Code Online (Sandbox Code Playgroud)\n\n

这相当平淡,但表明所有地址都在同一个通用区域中,即 C 堆栈。(在 Mac OS X 10.8.4 \xe2\x80\x94 64 位程序上测试,在没有任何命令行参数和较大环境的情况下调用。)

\n