首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C/C++ main函数的参数在哪里?

C/C++ main函数的参数在哪里?
EN

Stack Overflow用户
提问于 2010-11-17 00:06:49
回答 9查看 20.8K关注 0票数 60

在C/C++中,main函数接收char*类型的参数。

int main(int argc, char* argv[]){
  return 0;
}

argv是一个char*数组,指向字符串。这些字符串位于何处?它们是在堆上、堆栈上还是在其他地方?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2010-11-17 00:59:16

它实际上是编译器依赖和操作系统依赖的组合。main()是一个与任何其他C函数一样的函数,因此两个参数argcargv的位置将遵循平台上编译器的标准。例如,对于大多数面向x86的C编译器,它们将位于返回地址和保存的基指针之上的堆栈上(请记住,堆栈向下增长)。在x86_64上,参数在寄存器中传递,因此argc将在%edi中,而argv将在%rsi中。然后,由编译器生成的main函数中的代码将它们复制到堆栈中,这就是后面引用的位置。这是为了使寄存器可以用于main的函数调用。

argv所指向的char*块和实际的字符序列可以在任何地方。它们将在某个操作系统定义的位置开始,并可能被链接器生成的前导代码复制到堆栈或其他地方。您必须查看exec()的代码和链接器生成的汇编程序前导才能找到答案。

票数 18
EN

Stack Overflow用户

发布于 2010-11-17 00:08:39

它们是编译器的魔法,并且依赖于实现。

票数 31
EN

Stack Overflow用户

发布于 2010-11-17 00:29:50

这个问题的答案取决于编译器。这意味着它不是在C标准中处理的,所以任何人都可以随心所欲地实现它。这是正常的,因为操作系统也没有一个通用的、标准的方法来启动和结束进程。

让我们想象一个简单的,为什么不是这样的场景。

该进程通过某种机制接收写在命令行中的参数。因此,argc只是一个int,它被编译器放在程序进程(运行时的一部分)入口点的bootstrap函数推送到堆栈。实际值是从操作系统获取的,可以写在堆的内存块中。然后,构建argv向量,并且其第一个位置的地址也被压入堆栈。

然后调用必须由程序员提供的函数main(),并保存其返回值以供以后(几乎是即时)使用。将释放堆中的结构,并将为main获得的退出代码导出到操作系统。该过程结束。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4196201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档