хранение аргументов функции main ()? - PullRequest
0 голосов
/ 07 июля 2011

Я хотел бы знать, где arugment, переданный в main (), сохраняется в памяти, они просто сохраняются в стеке. Если так, то как значение 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 

Ответы [ 2 ]

6 голосов
/ 07 июля 2011

Обычно он хранится везде, где хранятся параметры других функций - которые могут быть стеками, регистрами или где-то еще целиком.Просто для нескольких примеров: на SPARC это почти наверняка будет регистр;на x86 (в 32-битном режиме) это обычно будет стек;на мэйнфрейме IBM он обычно находится в стековом фрейме, который динамически выделяется из кучи и связывается вместе в связанный список, созданный / уничтоженный в режиме FIFO.

Также обратите внимание, что он может изменяться дажеодна машина с одним компилятором - например, Microsoft VC ++ может передавать ее в стек или в регистр в зависимости от того, какие флаги компилятора вы используете.Когда / если вы передадите его в регистр, он (вероятно) будет помещен в стек внутри функции в любом случае (чтобы разрешить рекурсию).

В дополнение, я также отмечу, что пока ваш код вызов main совершенно допустим C, вам не разрешено вызывать main в C ++.

Редактировать: Что касается начального значения, то этот первый параметр традиционно называется argc и сообщает, сколько аргументов было передано в командной строке.Если вы вызываете его (как вы, очевидно, имеете) без командной строки, он обычно должен начинаться с 1 (один аргумент - это имя самой программы, традиционно передаваемое как argv[0]).Если, например, вы вызвали программу что-то вроде:

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

Обычно она завершается без печати чего-либо, потому что при первой записи в main параметр будет больше 10, поэтому телооператор if никогда не будет выполнен.

1 голос
/ 07 июля 2011

параметры для main () подобны аргументам для любого другого метода. Они являются частью стека (в зависимости от процессора, который может находиться в памяти или в регистре процессора). В этом случае, когда вы вызываете main (k + 1), результат k + 1 помещается в стек перед выполнением рекурсивного вызова.

Обратите внимание, что поведение этого не определено, поскольку вызов main () из программы на C не указан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...