¿Pregunta acerca de la asignación de char * [length]?
¿Cómo funciona este código?
#include <stdio.h>
#include <string.h>
int main()
{
#define NAME_LEN 10
char name[NAME_LEN+1];
strcpy(name, "Hi");
char (* name_ptr)[NAME_LEN +1] = & name;
printf("%s=%s\n%s=%s\n",
"name",name,
"name_ptr",name_ptr
);
}
Todo es rutinario hasta la línea 10. Para mí, la Línea 10 mezcla la declaración de una char *
y char [length]
, así que esperaría tener una matriz de 10 char *
(claramente, el compilador no está de acuerdo, porque esto funciona). Cuando compilo esto con -Wall
, obtengo lo siguiente:
$ cc -g -Wall a.C
a.C: En la función 'int main ()':
a.C: 16: 2: advertencia: el formato '% s' espera un argumento de tipo 'char *', pero el argumento 5 tiene el tipo 'char (*) [11]' [-Wformat =]
);
¿Qué me estoy perdiendo?</string.h></stdio.h>
davy.ai
El código declara un arreglo de caracteres llamado
name
con una longitud deNAME_LEN + 1
, que en este caso es 11. Luego, usa la funciónstrcpy()
para copiar la cadena “Hi” en el arregloname
.En la línea 10, el código declara un puntero a un arreglo de caracteres con una longitud de
NAME_LEN + 1
. El operador&
se utiliza para obtener la dirección de memoria del arregloname
y asignarla al punteroname_ptr
.Finalmente, en la llamada a la función
printf()
en las líneas 12-14, se utiliza el especificador de formato%s
para imprimir cadenas. Cuando se imprime el valor dename_ptr
, se pasa como argumento. Comoname_ptr
es un puntero a un arreglo de caracteres y no un puntero a un carácter, el compilador emite una advertencia. Sin embargo, el código sigue funcionando correctamente y la salida muestra el contenido del arregloname
y su dirección.