argv
es una matriz de punteros a carácter, lo que significa argv
va a almacenar la dirección de todas las cadenas que se pasa como argumento de la línea de comandos.
por lo argv[0]
voluntad le da la dirección de la primera cadena que se pasa como argumento de la línea de comandos, que se va a almacenar en la variable puntero array
en main
función.
Ahora solo debe pasar la dirección a la función foo
pero está pasando el primer caracter de esa cadena. Por ejemplo, si su primer argumento de línea de comando es temp.txt
, está pasando el carácter t
a la función foo
. De modo que dentro de la función foo
tiene una variable 0 array
, en ese valor ASCII del carácter t
se le asignará. Y luego lo está pasando al printf
, que pisa el valor de ASCII como dirección, e intenta acceder a esa dirección para imprimir, lo que provocará un bloqueo (comportamiento inesperado).
Por lo tanto, solo debe pasar la dirección del argumento de línea de comando a la función foo
como se muestra a continuación.
foo(array);
printf(array)
- Aquí printf
se pisa el especificador de formato como cadena (%s
) y se trata de imprimir todos los caracteres a partir de la dirección hasta el array
se encuentra con un carácter nulo \0
.
Pero es mejor agregar el printf
, como a continuación
printf("%s", array);
deferenciarlo gama mientras que pasa a foo. Así que solo pasa el primer valor de byte si es un literal de cadena c – Lefteris
Debe evitar una expresión como 'printf (s)' porque es una cadena de formato no controlada. – md5