sintaxis array c sizeof

c - array - sizeof string



¿Por qué sizeof(* “327”) devuelve 1 en lugar de 8 en un sistema de 64 bits? (4)

Buena respuesta por haccks .

Además, el comportamiento de su código no está definido , porque ha utilizado el especificador de formato incorrecto.

Por lo tanto, use %zu lugar de %lu porque sizeof() devuelve size_t y size_t unsigned está unsigned .

Norma C11: §7.21.6.1: Párrafo 9:

Si una especificación de conversión no es válida, el comportamiento no está definido.225) Si algún argumento no es del tipo correcto para la especificación de conversión correspondiente, el comportamiento no está definido.

printf("%lu /n", sizeof(*"327"));

Siempre pensé que el tamaño del puntero era de 8 bytes en un sistema de 64 bits, pero esta llamada sigue devolviéndose 1. ¿Alguien puede proporcionar una explicación?


La cadena literal es una matriz de caracteres estática y anónima, que decae en un puntero a su primer carácter, es decir, un valor de puntero de tipo char * .

Como una expresión de resultado como *"abc" es equivalente a *someArrayOfCharName , que a su vez es equivalente a *&firstCharInArray que da como resultado firstCharInArray . Y sizeof(firstCharInArray) es sizeof(char) que es 1 .


La declaración:

printf("%lu /n", sizeof(*"327"));

en realidad imprime el tamaño de un char , ya que usa * desreferencias el primer carácter de la cadena 327 . Cambiarlo a:

char* str = "327"; printf("%zu /n", sizeof(str));

Tenga en cuenta que necesitamos usar %zu aquí, en lugar de %lu , porque estamos imprimiendo un valor size_t .


Poner * antes de un literal de cadena desreferirá el literal (ya que los literales de cadena son una matriz de caracteres y decaerán para apuntar a su primer elemento en este contexto). La declaración

printf("%zu /n", sizeof(*"327"));

es equivalente a

printf("%zu /n", sizeof("327"[0]));

"327"[0] proporcionará el primer elemento del literal de cadena "327" , que es el carácter ''3'' . El tipo de "327" , después de la descomposición, es de char * y, después de la anulación de la referencia, dará un valor de tipo char y, en última instancia, sizeof(char) es 1 .