argv
è un array di puntatori di caratteri, che significa argv
sta per memorizzare l'indirizzo di tutte le stringhe che vi passato come argomento della riga di comando.
così argv[0]
ti darà l'indirizzo della prima stringa che hai passato come argomento della riga di comando, che stai memorizzando nella variabile puntatore array
nella funzione main
.
Ora è necessario passare solo l'indirizzo alla funzione foo
ma si passa il primo carattere di quella stringa. Ad esempio se il tuo primo argomento da riga di comando è temp.txt
, stai passando il carattere t
alla funzione foo
. Quindi all'interno della funzione foo
si ha una variabile del puntatore del char array
, nel quale verrà assegnato il valore ASCII del carattere t
. E quindi lo passi a printf
, che calcola quel valore ASCII come indirizzo, e proverà ad accedere a quell'indirizzo per stampare che porterà ad un arresto anomalo (comportamento imprevisto).
Quindi è necessario passare solo l'indirizzo dell'argomento della riga di comando alla funzione foo
come di seguito.
foo(array);
printf(array)
- Qui printf
sarà calcherà l'identificatore di formato come stringa (%s
) e sarà cerca di stampare tutti i caratteri a partire dall'indirizzo array
fino a che non incontra un carattere null \0
.
Ma meglio aggiungere il printf
come qui di seguito
printf("%s", array);
si dereference di matrice durante il passaggio a foo. Quindi si passa solo il valore del primo byte se si tratta di una stringa c letterale – Lefteris
Si dovrebbe evitare un'espressione come 'printf (s)' perché è una stringa di formato incontrollata. – md5