我想知道传递给main()的where参数是否存储在内存中,是否只是存储在堆栈中。如果是,那么k的值是如何在下面的代码中初始化的
#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
答案 0 :(得分:6)
它通常存储在存储其他函数的参数的任何地方 - 可能是堆栈,寄存器或其他地方。仅举几个例子:在SPARC上,它几乎肯定是一个寄存器;在x86上(在32位模式下)它通常是堆栈;在IBM大型机上,它通常位于堆栈框架中,该堆栈框架是从堆中动态分配的,并链接在一起构建/销毁FIFO时尚的链表。
另请注意,即使在使用单个编译器的单台计算机上它也可以/确实有所不同 - 例如,Microsoft VC ++可以将其传递到堆栈或寄存器中,具体取决于您使用的编译器标志。当/如果你将它传递给寄存器时,它(可能)会被推到函数内部的堆栈中(以允许递归)。
顺便说一句,我还要注意,虽然你的代码调用main
是完全合法的C,但你不能在C ++中调用main
。
编辑:对于初始值,第一个参数传统上称为argc
,并告诉您在命令行上传递了多少个参数。如果你在没有命令行的情况下调用它(如你所示),它通常应该以{{1}}开头(一个参数是程序本身的名称,传统上传递为1
)。例如,如果你调用了类似的程序:
argv[0]
它通常会在不打印任何内容的情况下退出,因为在prog a b c d e f g h i j k l m
的第一个条目中,参数将大于10,因此main
语句的主体将永远不会执行。
答案 1 :(得分:1)
main()的参数类似于任何其他方法的参数。它们是堆栈的一部分(取决于处理器,可能在内存中,或在CPU寄存器中)。在这种情况下,当你调用main(k + 1)时,k + 1的结果在执行递归调用之前被放在堆栈上。
请注意,由于未指定从C程序中调用main(),因此未定义此行为。