C main()函数参数存储?

C main()函数参数存储?,c,C,我想知道传递给main的数据段存储在内存中的什么地方,它们只是存储在堆栈中吗 #include<stdio.h> int main(int k) { if(k<10) printf("%d ",main(k+1)); return k; } O/p: 10 9 8 7 6 5 4 3 2 main的参数类似于任何其他方法的参数。它们是堆栈的一部分,具体取决于处理器,可以在内存中,也可以在CPU寄存器中。在这种情况下,当您调用maink+1时,在执行递归调用之

我想知道传递给main的数据段存储在内存中的什么地方,它们只是存储在堆栈中吗

 #include<stdio.h>
 int main(int k)
 {
 if(k<10)
 printf("%d ",main(k+1));
 return k;
 }

O/p: 10 9 8 7 6 5 4 3 2 

main的参数类似于任何其他方法的参数。它们是堆栈的一部分,具体取决于处理器,可以在内存中,也可以在CPU寄存器中。在这种情况下,当您调用maink+1时,在执行递归调用之前,将k+1的结果放在堆栈上


请注意,这种行为是未定义的,因为从C程序中调用main是未指定的。

它通常会存储在存储其他函数的参数的任何位置,这些参数可能是堆栈、寄存器或其他完全不同的位置。仅举几个例子:在SPARC上,它几乎肯定是一个寄存器;在32位模式的x86上,它通常是堆栈;在IBM大型机上,它通常位于堆栈框架中,该堆栈框架从堆中动态分配,并链接到一个以FIFO方式构造/销毁的链表中

还要注意的是,即使在使用单个编译器的单个计算机上,它也可能/确实会发生变化-例如,Microsoft VC++可以根据您使用的编译器标志在堆栈或寄存器中传递它。当/如果在寄存器中传递它,它可能会被推到函数内部的堆栈上,以允许递归

作为一个旁白,我也注意到,虽然您的编解码主体是完全合法的C,但不允许在C++中调用主。 编辑:对于初始值,第一个参数传统上称为argc,它告诉您在命令行上传递了多少个参数。如果您在没有命令行的情况下调用它,它通常应该以1开始,一个参数是程序本身的名称,传统上作为argv[0]传递。例如,如果您调用了以下程序:

prog a b c d e f g h i j k l m

它通常会在不打印任何内容的情况下退出,因为在main的第一个条目上,参数将大于10,因此if语句的主体将永远不会执行

用C调用main是非常好的。在C++中,它是不允许的/支持的。@杰姆斯,我想知道的是K从何处获取它的初始值?通常,它是命令行参数。我不确定如果不是由system@Amit对于linux,请参阅exec系统调用。简而言之,系统构建一个进程映像,其中包含数据段中的参数字符串,以及映像中的一些汇编语言启动代码crt0.o,该映像使用参数count int argc和指向参数字符串char**argv的指针作为参数调用main。由于定义的main不正确,因此k的值没有得到很好的定义;它可能是argc的值,也可能是argv的整数表示形式,也可能是垃圾,或者程序可能会崩溃。因此,您想说的是,此程序的行为未定义??应该注意的是,根据标准,int maink并不能真正保证工作。k通常是argc作为签名int maiint argc,char**argv是预期的,但是上面的代码很好,实际上不应该被期望工作。仍然没有得到期望的anwser!!int mainint在标准中不是有效的签名,但如果实现指定它,则可以是有效的。因此,实现可以将该签名指定为它喜欢的任何含义,因此从技术上讲,它可以以实现喜欢的任何方式初始化。实际上,它通常是标准签名int maiint,char**中argc的值,当程序在没有参数的情况下被调用时,argc的值为1。谢谢@Chris,这使得调用方将一些sensek存储在堆栈或寄存器中。最初的调用者是调用main的启动代码。在将int mainit指定为main的有效签名的平台上,该代码完全合法。虽然这在许多编译器上无疑是可行的,但我感觉很少有人真的愿意保证它。@Chris:是的,这是真的。我应该更清楚:在C中允许用支持签名调用main,但不是C++。Jerry Thanks,在编辑部分中,使事情非常简单和简单。我不真正回答这个问题,这是如何对主GET设置的初始调用的参数。为此,您需要讨论linux上的crt0或其他系统上的类似启动代码。实际上,对于x86,它基本上取决于您使用的调用约定:使用MSVC的_uFastCall,前两个参数将存储在ecx/edx中,但fastcall不是标准化的。