C 命令行参数驻留在哪里?

C 命令行参数驻留在哪里?,c,linux,memory,C,Linux,Memory,众所周知,C中main函数的原型是intmain(intargc,char**argv)。argv数组指向的字符串驻留在哪里?它们在哪个内存段中?数据、堆栈还是堆 谢谢。在Linux下,当程序启动时,指针本身和它们指向的字符串都在堆栈上。这将位于main()的堆栈框架上方的某个位置。C库启动代码负责将适当的指针传递到main() 您可以在函数create_elf_tables()中的fs/binfmt_elf.c中找到设置新程序堆栈的内核代码,包括参数和其他所有内容 (我刚刚学到的有趣的事实:在

众所周知,C中main函数的原型是
intmain(intargc,char**argv)
。argv数组指向的字符串驻留在哪里?它们在哪个内存段中?数据、堆栈还是堆


谢谢。

在Linux下,当程序启动时,指针本身和它们指向的字符串都在堆栈上。这将位于
main()
的堆栈框架上方的某个位置。C库启动代码负责将适当的指针传递到
main()

您可以在函数
create_elf_tables()
中的
fs/binfmt_elf.c
中找到设置新程序堆栈的内核代码,包括参数和其他所有内容


(我刚刚学到的有趣的事实:在堆栈的更上层,您可以找到16个随机字节,放在内核的
exec
时间,以方便您进行RNG种子植入。以防您不想麻烦地打开
/dev/uradom

也许这会有所帮助@kaylum:所谓的重复询问是在C语言级别,唯一的答案是“实现定义”。这里请注意标签:它是关于一个特定的实现?这是否意味着main()可以有三个以上的参数,以便可以访问这些字节?如果是,原型是什么?如果没有,您如何访问这些字节?您,用户,不应该访问它们。C库启动代码可以访问它们,因为当程序开始执行时,它们位于堆栈底部的已知偏移量(
%rsp
)。例如,它可以使用它们调用
srand()
。但是,除非您非常熟悉C启动代码的功能,或者除非它以某种方式使这些字节可用(我不知道它是否可用),否则您的代码将无法很好地了解它们的位置。实际上,
main()
确实有一个可选的3参数。指向环境的指针。然而,第三个论点很少使用。