¿Afecta ampersand frente a la matriz de char scanf? ¿Es legítimo?

Cuando usualmente ingresamos la cadena, hacemos esto:

#include  int main() { char str[256]; scanf("%s",str); //Other Operation } 

Pero hoy, en la clase de progtwigción, uno de mis amigos escribió la línea scanf así:

 scanf("%s",&str); 

Y pasa la comstackción, y funciona.

La pregunta es, ¿me gustaría saber si esto es “legal” en C o no, o simplemente un comportamiento indefinido?

Es un comportamiento indefinido (porque el tipo scanf() espera que sea char * , pero usted pasa un char (*)[256] ), pero generalmente “funciona” (parece estar funcionando) ya que la dirección de una matriz es a menudo la igual (con respecto al valor numérico del puntero) como la dirección de su primer elemento.

De la documentación oficial :

Si este objeto no tiene un tipo apropiado, o si el resultado de la conversión no puede representarse en el espacio provisto, el comportamiento no está definido.

(énfasis mío)

Es un comportamiento técnicamente indefinido. Sin embargo, ambos métodos funcionan en la práctica con matrices de caracteres porque la referencia a str se pasa a scanf() convierte en un puntero al primer elemento, que será igual a un puntero a la matriz en sí (la dirección de str , o &str ), por lo que el mismo valor se pasa de cualquier manera.

No estoy seguro de si solo has estado trabajando con cuerdas hasta ahora, pero ten en cuenta que si miras algo que no es una matriz, es más fácil decir que el método de tu amigo sería correcto:

 int myInt; scanf("%d", &myInt); 

scanf() está buscando un puntero, por lo que desea darle la dirección de su variable entera. Esto se debe a que pasar myInt le da un valor (actualmente basura), mientras que &myInt le dice dónde colocar el valor que lee.

* Excepto en Win16.

Tanto str como &str se definen para tomar el valor de la dirección de memoria del primer elemento de la matriz. A pesar de la indicación de H2CO3 de que este es un comportamiento indefinido, esto siempre funcionará en la práctica.