Jest to raczej pytanie koncepcyjne w tym miejscu, a nie praktyczne, ale naprawdę przeszkadza mi.Znaleźć rozmiar ciągu w argv używając sizeof
Załóżmy, że mam program c o nazwie "test.c" i chcę znaleźć liczbę spacji w tablicy dla słowa, które użytkownik wpisze jako argument. Na przykład "./test.c test_run" powinno wypisać 9, ponieważ jest 8 znaków, a potem 1 znak kończący zero. Kiedy próbuję użyć sizeof na argv chociaż mam problemy.
int main(int argc, char *argv[]) {
char buf10[10];
printf("The size of buf10 is: %i.\n", sizeof(buf10));
return 0;
}
drukuje wynik: "Wielkość buf10 jest: 10.". Ma to sens, ponieważ wybrałem tablicę znaków. W języku C rozmiar znaku to 1 bajt. Jeśli wybiorę int, ta liczba będzie 4.
Teraz moje pytanie brzmi: dlaczego nie mogę tego zrobić z argv?
int main(int argc, char *argv[]) {
printf("argv[1] has the value: %s\n", argv[1]);
printf("strlen of argv[1] is: %i\n", strlen(argv[1]));
printf("sizeof of argv[1] is: %i\n", sizeof(argv[1]));
return 0;
}
Ran z "./test Hello_SO" daje wynik:
argv[1] has the value: Hello_SO
strlen of argv[1] is: 8
sizeof of argv[1] is: 4
Długość ciąg sens, ponieważ powinno być 9 ale minus "\ 0" sprawia 8.
Jednak nie rozumiem, dlaczego sizeof powraca 4 (rozmiar wskaźnika). Rozumiem, że * argv [] można uważać za ** argv. Ale już to uwzględniłem. W moim pierwszym przykładzie drukujemy "buf", ale tutaj drukujemy "argv [1]". Wiem, że mogę łatwo uzyskać odpowiedź za pomocą strlen, ale jak powiedziałem wcześniej, jest to po prostu koncepcyjne w tym momencie.
Wygląda na to, że prawdopodobnie odpowiedziałeś na własne pytanie. – alex
'argv [1]' ma typ 'char *', więc 'sizeof argv [1]' oznacza 'sizeof (char *)'. To właśnie robi sizeof. –
Ale dlaczego buf10 drukuje 10, a argv [1] nie drukuje 9. buf10 jest także wskaźnikiem czy nie jest? –