Jest definicja:
int
main(
int argc
, char *argv[]
){ return 0;
}
Czy mogę w funkcji main
zmieniać znaki tekstów zawartych w tablicy argv
?
Jest definicja:
int
main(
int argc
, char *argv[]
){ return 0;
}
Czy mogę w funkcji main
zmieniać znaki tekstów zawartych w tablicy argv
?
Argumenty są święte. Skopiuj i tam sobie zmieniaj do woli.
BTW skąd taka brzydka konwencja pisania?
C11 standard draft N1570, §5.1.2.2.1/2:
The parameters
argc
andargv
and the strings pointed to by the argv array shall be modifiable by the program, and retain their last-stored values between program startup and program termination.
Więc odpowiedź brzmi tak. Możesz.
Formalnie możesz. Ale dlaczego chciałbyś to robić?
kq napisał(a):
Formalnie możesz. Ale dlaczego chciałbyś to robić?
Potrzebowałem podzelić argument na dwie części przy pomocy znaku '\0'
. Ale i tak ostatecznie skopiowałem go.
Ciekawostka: można to wykorzystać do leakowania informacji, bo stackprotector w komunikacie błędu ma coś takiego:
*** stack smashing detected ***: ./a.out terminated
Aborted (core dumped)
Jak nadpiszemy argv[0] to ten komunikat będzie zawierał to co na nadpisaliśmy! Patrz np. https://nandynarwhals.org/32c3-readme/