2014-07-15 15 views
5

W systemie Linux elementy tablicy argv zawsze zajmują sąsiadujące ze sobą pozycje w pamięci, tzn. Pierwszy znak argv [n + 1] natychmiast następuje po kończącym nul bajcie argv [n], dla n = 0 ... (argc-1).Czy elementy tablicy argv zawsze są ciągłe w pamięci?

Czy to jest zagwarantowane w przypadku wszystkich systemów POSIX/wszystkich implementacji C?

+0

Spróbuj wstawić dodatkowe spacje między argumentami wiersza poleceń i sprawdź ponownie. – user3386109

+2

@ user3386109: Poważnie wątpię, że to by miało jakąkolwiek różnicę. Jest prawdopodobne, że * dla danej implementacji * ciągi argumentów będą przydzielane w sposób ciągły, ale nie ma gwarancji (i nie ma żadnego powodu, dla którego mógłbym polegać na tym). –

+0

@KeithThompson Jedną z możliwych implementacji jest użycie 'strtok' do przerwania linii poleceń. Ciągi argumentów byłyby wtedy nieciągłe, gdyby linia poleceń zaczęła się od dodatkowych spacji. Ale niezależnie od tego, zgadzam się, że nie ma żadnej gwarancji i nie ma żadnego powodu, by polegać na ciągłych ciągach znaków. – user3386109

Odpowiedz

7

Nie ma gwarancji. Ani przez C, ani przez POSIX.

+0

Czy to nie gwarantuje, że tablica jest ciągłym blokiem pamięci? Jeśli tak, to dlaczego miałby to być wyjątek? –

+8

@ManojAwasthi 'argv' jest tablicą wskaźników" char ", tj.' Char * argv [N] '. Gwarantuje się, że wskaźniki ciągu będą ciągłe w pamięci, a nie ciągi. – ouah