2012-06-13 9 views
33

Zastanawiam się, czy parametry linii poleceń są zawsze zakończone wartością NUL? Google wydaje się mówić "tak", a kompilacja na GCC wskazuje, że tak jest, ale czy mogę zagwarantować, że to zawsze będzie prawda?Czy char * argumenty argv [] w głównej null są zakończone?

int main(int argc, char** argv) 
{ 
    char *p; 

    for(int cnt=1; cnt < argc; ++cnt) 
    { 
     p = argv[cnt]; 
     printf("%d = [%s]\n", cnt, p); 
    } 
    return 0; 
} 

$ MyProgram -arg1 -arg2 -arg3 
1 = -arg1 
2 = -arg2 
3 = -arg3 
+4

Tak, to prawda. – kol

+2

Pomyśl przez chwilę: * co by się stało, gdyby nie zakończyły się one NULL? * –

+0

Myślenie przez chwilę ... char [] i char * nie implikuje automatycznie ciągu w stylu C. Oczywiście cały łańcuch wiersza polecenia ma wartość NULL zakończoną, ale nie musi być tłumaczona na każdą pojedynczą tablicę znaków przekazywanych w wierszu polecenia zakończonym NULL. Łatwo będzie argv, aby usunąć białe spacje z wiersza poleceń i mieć macierze znakowe zakończone znakiem Null, a nie ciągi w stylu C. – LeviX

Odpowiedz

56

Tak. Wskaźniki w tablicy argv wskazują łańcuchy C, które z definicji są zakończone znakiem null.

Standard języka C stwierdza, że ​​elementy tablicy "zawierają wskaźniki do napisów" (C99 §5.1.2.2.1/2). Ciąg jest "ciągłą sekwencją znaków zakończoną przez pierwszy znak null" (C99 §7.1.1/1), to znaczy, że są one z definicji zerowe.

Co więcej, element tablicy na argv[argc] jest wskaźnikiem zerowym, więc sama tablica jest w pewnym sensie "zakończona zerem".

+0

Czy możesz wyjaśnić użycie argc, jeśli argument argv ma wartość "null" zakończoną. Nie możemy wykryć nie. argumentów, przechodząc przez tablicę do momentu osiągnięcia "\ 0" ...? – Snehasish

+0

@Snehasish Tak, możesz obliczyć 'argc' z' argv'. Co do tego, dlaczego 'main' ma podpis, nie wiem na pewno. Tak było, odkąd istniałem. –

+0

Zgaduję, że z powodów historycznych ... – Snehasish

4

Tak, zawsze jest prawdą, że argumenty są łańcuchami zakończonymi wartością NUL.

Powiązane problemy