C – Tamaño de punteros

2 minutos de lectura

avatar de usuario
RadicalOne

char c[] = {'a','b','c'};
int* p = &c[0];
printf("%i\n", sizeof(*p)); //Prints out 4
printf("%i\n", sizeof(*c)); //Prints out 1

Estoy extremadamente confundido acerca de esta sección de código. Tanto p como c representan la dirección de la matriz c en el índice 0. Pero, ¿por qué sizeof(*p) imprime 4? ¿No debería ser 1?

Porque p es de tipo int *entonces *p es de tipo intque aparentemente tiene 4 bytes de ancho en su implementación.


Y use %zu para imprimir size_t (qué sizeof yields) si no desea que su programa invoque un comportamiento indefinido.

  • O convertir a int y use "%d" o "%i" si su implementación (tosmicrosofttos) no es compatible "%zu".

    –Keith Thompson

    21 de agosto de 2013 a las 21:51

  • @KeithThompson Sí 🙂 (MS necesitaría seriamente comenzar a vivir en el siglo XXI y admitir al menos C99 …)

    usuario529758

    21 de agosto de 2013 a las 21:58

  • O, mejor, convertir a unsigned long y use "%lu"

    –Keith Thompson

    21/08/2013 a las 22:30

  • @KeithThompson por qué int p puntero aceptar dirección de char .este código int* p = &c[0]. Pensé solo void* punteros pueden tomar cualquier tipo

    – Cholti Paul Ttiopic

    9 sep 2015 a las 15:51


  • @CholthiPaulTtiopic: No es así. Dado char c[10]gcc advierte initialization from incompatible pointer type

    –Keith Thompson

    9 sep 2015 a las 16:56

sizeof(*p) es el tamaño de la int objeto al que p puntos.

sizeof(*p) imprimirá el tamaño de p que es 4 debido a int pero c es de char por eso es 1

avatar de usuario
JackCColeman

En C (no C99) el sizeof operador es estrictamente un cálculo de tiempo de compilación. así que cuando sizeof (*p) [a dereferenced ptr to an integer] se evalúa entonces el tamaño de int es cuatro.

Nota. los (*p) parte de esa instrucción es un operador “cast”. Entonces, sizeof NO es una llamada de función como en sizeof(xyz)más bien es como sizeof var_name o sizeof (int *).

Cuando su programa se ejecuta, cambia el objeto al que apunta p, pero el valor de sizeof (*p) ya fue computado y codificado en su módulo de carga ejecutable.

Creo que su confusión es que estaba pensando que C averiguaría a qué tipo de datos apuntaba p cuando se ejecuta su programa.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad