¿Cómo funciona sizeof () para char * (variables de puntero)?

Tengo un código C:

char s1[20]; char *s = "fyc"; printf("%d %d\n", sizeof(s1), sizeof(s)); return 0; 

Vuelve

 20 8 

Me pregunto cómo es el 8, gracias!

sizeof(s1) es el tamaño de la matriz en la memoria, en su caso, 20 caracteres, cada uno de los cuales 1 byte es igual a 20.

sizeof(s) es el tamaño del puntero. En diferentes máquinas puede tener un tamaño diferente. En la mía es 4.

Para probar diferentes tamaños de tipo en su máquina, solo puede pasar el tipo en lugar de una variable como printf("%zu %zu\n", sizeof(char*), sizeof(char[20])); .

Imprimirá 4 y 20 respectivamente en una máquina de 32 bits.

sizeof(char *) es el tamaño del puntero, normalmente 4 para la máquina de 32 bits y 8 para la máquina de 64 bits.

sizeof an array, por otro lado, genera el tamaño de la matriz, en este caso, 20 * sizeof (char) = 20

Una cosa más, debe usar %zu para el tamaño printf en formato printf .

 printf("%zu %zu\n", sizeof(s1), sizeof(s)); 

8 es el tamaño de un puntero, una dirección. En la máquina de 64 bits tiene 8 bytes.

El operador sizeof devuelve el tamaño de un tipo . El operando de sizeof puede ser el nombre entre paréntesis de un tipo o una expresión, pero en cualquier caso, el tamaño se determina únicamente a partir del tipo del operando.

sizeof s1 es, por lo tanto, estrictamente equivalente a sizeof (char[20]) y devuelve 20 .

sizeof s es estrictamente equivalente a sizeof (char*) y devuelve el tamaño de un puntero a char ( 64 bits en su caso).

Si desea que la longitud de la cadena C apunte con s , puede usar strlen(s) .

Si se encuentra en una computadora de 64 bits, las direcciones de memoria son de 64 bits, por lo tanto, se debe usar un valor numérico de 64 bits (8 bytes x 8 bits por byte) para representar la variable del puntero numérico (char *).

En otras palabras, sizeof () funciona de la misma manera para los punteros que para las variables estándar. Solo debe tener en cuenta la plataforma de destino cuando utilice punteros.