C: advertencia: el formato ‘% s’ espera el tipo ‘char *’, pero el argumento 2 tiene el tipo ‘char (*) ‘

Estoy intentando ejecutar un progtwig C simple, pero aparece este error: “advertencia: el formato ‘% s’ espera el tipo ‘char ‘, pero el argumento 2 tiene el tipo ‘char ( ) [20]'”

Ejecutando Mac OSX Mountain Lion Comstackndo en terminal usando gcc 4.2.1

#include  int main() { char me[20]; printf("What is your name?"); scanf("%s",&me); printf("Darn glad to meet you, %s!\n",me); return(0); } 

 scanf("%s",&me); 

debiera ser

 scanf("%s",me); 

Explicacion

"%s" significa que scanf está esperando un puntero al primer elemento de una matriz de caracteres. me es una matriz de objetos y podría evaluarse como puntero. Por eso me puedes usar directamente sin agregar & . Agregar & para me se evaluará como 'char (*)[20]' y su scanf está esperando char *

Código crítico:

El uso de "%s" podría provocar un desbordamiento del búfer si el usuario ingresa una cadena con una longitud> 20. Por lo tanto, cámbielo a "%19s" :

 scanf("%19s",me); 

Excepto cuando es el operando de sizeof , _Alignof , o unary & operator, o si se utiliza un literal de cadena para inicializar una matriz en una statement, se convertirá una expresión de tipo “matriz de elementos N de T ” (“decaimiento “) a una expresión de tipo” puntero a T “, y se evaluará a la dirección del primer elemento de la matriz.

La matriz me está declarada como una matriz de 20 elementos de char ; Normalmente, cuando la expresión me aparece en su código, se tratará como una expresión de tipo “puntero a char “. Si hubieses escrito

 scanf("%s", me); 

entonces no habrías recibido el error; la expresión me se habría convertido en una expresión del tipo correcto.

Sin embargo, al usar el operador & , ha omitido esa regla; en lugar de un puntero a char , está pasando un puntero a una matriz de char ( char (*)[20] ), que no es lo que scanf espera para el especificador de conversión %s , de ahí el diagnóstico.