Una matriz "decae" en un puntero a su primer elemento, por lo que scanf("%s", string)
es equivalente a scanf("%s", &string[0])
. Por otro lado, scanf("%s", &string)
pasa un puntero a char[256]
, pero apunta al mismo lugar.
Luego scanf
, al procesar la cola de su lista de argumentos, intentará extraer a char *
. Eso es lo correcto cuando ha pasado string
o &string[0]
, pero cuando ha pasado &string
depende de algo que el estándar del lenguaje no garantiza, a saber, los punteros &string
y los &string[0]
punteros a objetos de diferentes tipos y tamaños que comenzar en el mismo lugar: se representan de la misma manera.
No creo haber encontrado un sistema en el que eso no funcione, y en la práctica probablemente estés a salvo. Sin embargo, está mal y podría fallar en algunas plataformas. (Ejemplo hipotético: una implementación de "depuración" que incluye información de tipo con cada puntero. Creo que la implementación de C en las "Máquinas Lisp" de Symbolics hizo algo como esto).
scanf
, y tanto la pregunta como la respuesta aceptada se centran en eso, y omita las restricciones críticamente importantes para la longitud máxima de entrada que deberían usarse en el código real (pero que están fuera del punto de esta pregunta).