2010-09-16 15 views
9

Czy istnieje limit liczby argumentów, które przechodzimy do main() w C? Jak wszyscy wiecie, jest on zdefiniowany jako int main(int argc, char *argv[]).Limit liczby argumentów głównych w C

Kiedy zadzwonić program, mogę przekazywać argumenty tak:

$ prog.exe arg1 arg2 arg3.....argn 

Czy istnieje górna granica liczby argumentów, które mogą Dostarczamy main() w ten sposób?

+0

Zobacz także [Aby sprawdzić warunek E2BIG w 'exec()'] (http://stackoverflow.com/questions/18559403/to -check-the-e2big-error-condition-in-exec). –

Odpowiedz

13

Nie, nie ma ograniczeń nałożonych przez standard ISO C99. Jeśli używasz „błogosławiony” main formularz (którego istnieją dwa):

int main (int argc, char *argv[]); 

wtedy będzie ograniczona do maksymalnej wielkości liczba całkowita ze znakiem (zależna od implementacji, ale gwarancją co najmniej 2 -1 lub 32 767).

Oczywiście, można nawet mieć więcej niż że skoro średnia umożliwia specjalnie dla non-błogosławionych main formy (na przykład taki, który bierze long jako licznik).

Norma określa, w jaki sposób przechowywane są argumenty i takie, jak argv[argc], które muszą być NULL, ale nie ogranicza bezpośrednio ilości.

Oczywiście w praktyce będzie limit, ale będzie to zależało wyłącznie od implementacji i środowiska. Jednakże, jeśli musisz zapytać, prawdopodobnie robisz something wrong.

Większość narzędzi byłoby postawić naprawdę dużą liczbę argumentów w pliku odpowiedzi (słownie args.txt) następnie przechodzą jeden argument jak:

my_prog @args.txt 

który omija arbitralnych ograniczeń dotyczących ilości argumentów i wielkości.

+0

Przez "nie-błogosławiony" masz na myśli, że Standard pozwala implementacjom "pracować" bez systemu operacyjnego? – pmg

+1

Nie, nie do końca. Nadal można używać jednej z dwóch form kanonicznych w środowisku innym niż OS, nawet jeśli nie ma żadnych argumentów przekazywanych. "Main" zwykle nie jest punktem początkowym, więc kod startowy może wypchnąć zero 'argc' i NULL' argv [0] 'przed wywołaniem' main'. Mam na myśli to, że ISO dopuszcza inne warianty głównego, na przykład wariant '{argc, argv, envp}' z Uniksa, w którym również przekazywane jest środowisko. – paxdiablo

+0

+1 za udzielenie odpowiedzi na niektóre okna. @pmg: Nie, oznacza to, że Standard pozwala systemom/środowisku zdefiniować inne nieprzenośne formaty dla 'głównego'. – Potatoswatter

1

Nie sądzę. Chociaż nie może być teoretycznego limitu, komputer prawdopodobnie nie poradzi sobie z 1,5 milionami argumentów. Czy jest jakiś szczególny powód, dla którego musisz to wiedzieć? Nie polecam za pomocą argumentów wiersza poleceń do rzeczy innych niż opcje, parametry plików, ect ...

+0

To było z powodu tej dyskusji, którą prowadziłem ze swoim kolegą. Mój kolega został zadany to pytanie w wywiadzie. Zastanawiam się, czy może być ograniczona przez rozmiar stosu lub wielkość int jako Andrew wspomniano, ale nie jestem pewien żadnego z nich. – RaviPathak

+0

@Ravi: Nie idą na stos. Jest bardziej prawdopodobne ograniczenie przez układ pamięci procesu lub inną konfigurację systemu operacyjnego. Teoretycznie możesz zaimplementować * nowe środowisko * C inne niż natywna platforma ABI z większymi możliwościami. – Potatoswatter

+0

@Potatoswatter: Miejsce na argumenty jest często przydzielane na początkowym stosie procesu. Łatwo jest je tam umieścić, ponieważ system operacyjny i tak musi skonfigurować ten obszar, i pozwala na zmianę wielkości argumentów w przyszłych wersjach systemu operacyjnego, ponieważ nie opiera się na rozmiarze argumentów. – nategoose

14

Według specyfikacji POSIX dla exec, istnieje makro ARG_MAX zdefiniowane w <limits.h> który określa maksymalną liczbę bajtów dla argumenty + zmienne środowiskowe.

Ale ponieważ C nie definiuje niczego na ten temat, nie, nie ma nieodłącznego ograniczenia między platformami. Musisz skonsultować się z podręcznikiem systemu operacyjnego, jeśli nie definiuje tego makra.

+0

Odp: 'exec()' syscall. Systemy operacyjne po prostu ze względów zdrowotnych ograniczają ilość pamięci, jaką musieliby przenieść ze starego obrazu pamięci procesowej do tworzonego nowego obrazu. Ponieważ transfer odbywa się w jądrze, musi istnieć ograniczenie, aby uniknąć procesów użytkownika zużywających pamięć jądra (wyobraź sobie [bomba fork/shell] (http://en.wikipedia.org/wiki/Fork_bomb#Example_fork_bombs)). W systemie Windows, który nie powinien mieć znaczenia, ponieważ stary proces pozostaje, ale IIRC ograniczają go również do 32K. – Dummy00001

+0

Wartość podana przez 'limit.h' może być niższa od rzeczywistej wartości obsługiwanej przez system operacyjny i może być przeznaczona do użycia jako sposób powiedzenia" no, wiemy, że może być co najmniej tak duża ". Podczas konfigurowania argumentów dla 'exec' może to być wystarczająco dobre, ale nie będę polegał na tej wartości dla rozmiaru argumentów, że program mógł zostać przekazany przez system operacyjny. – nategoose

0

W samym C nie ma żadnych ograniczeń. Jest to przykład zachowania nie zdefiniowanego w języku, ale raczej jego implementacja. Pamiętaj, że sam język jest inny niż jego implementacja, kolejne biblioteki, IDE itp.