El tamaño de la variable de puntero en una estructura

int main()
{
    struct
    {
        char *name_pointer;
        char all[13];
        int foo;
    } record;

    printf("%d\n",sizeof(record.all));
    printf("%d\n",sizeof(record.foo));
    printf("%d\n",sizeof(record));

    return 0;
}

Quiero que el tamaño del puntero vatiable «*name_pointer» en la estructura….

  • leer: ¿Qué sizeof(&arr) volver? para conocer las diferencias entre name_pointer y all.
  • sizof(char*); diría
  • sizeof(registro.name_pointer);
  • desea sizeof(record.name_pointer) o strlen(record.name_pointer) ?
  • ¿qué te detuvo de sizeof(registro.name_pointer);
InformationsquelleAutor user2641934 | 2013-08-01

3 Kommentare

  1. 7

    Para obtener el tamaño del puntero del uso

    printf("%d\n", (int) sizeof(record.name_pointer));

    Su posible obtener 2, 4, 6, 8, etc.


    Para obtener el tamaño de los datos que está apuntado por el puntero (un char) uso

    printf("%d\n", (int) sizeof(*record.name_pointer));

    Tu debe tener 1.


    Para obtener la longitud de cadena de la cadena a la que apunta el puntero, suponiendo record.name_pointer puntos legítimos de datos, uso

    printf("%d\n", (int) strlen(record.name_pointer));

    BTW Como @alk dice y por qué la (int) fundición de arriba, un especificador de conversión para uso con sizeof() incluye la ‘z’ prefijo. El resultado de sizeof() y strlen() es de tipo size_t. Aunque size_t y int a menudo son los mismos, hay muchos sistemas que son de diferentes tamaños. Y desde sizeof() es un «tipo de entero sin signo» (C11 6.5.3.4), recomiendo

    printf("%zu\n", sizeof(...
    • en la segunda – de los datos que se apunta es una cadena – no es el primer carácter. así que esto es incorrecto.
    • Pequeñeces: Como strlen() devuelve size_t el adecuado especificador de conversión debe ser precedido por el modificador de longitud z para convertirse en zd.
    • se define como char *, por lo que apunta exactamente a una carácter. Así que todo está bien.
    • Sí – estoy de acuerdo – pensé en eso, pero estaba seguro de agregar que la mejora a una pregunta básica.
    • Awasthi record.name_pointer es un puntero a un char, por lo tanto la sizeof(*grabar.name_pointer) será 1. Como una cadena en C es una variable de matriz de longitud de caracteres y la cadena de valor se pasa por la dirección de la primera char, si record.name_pointer es usa para señalar a sólo 1 char, una cadena o fijo de una matriz de char es indistinguible de la OP fragmento de código.
  2. 0

    Variable de puntero siempre(sistema de 32 bits de la arquitectura), tienen el tamaño 4.
    si usted tiene 64 bits de la arquitectura del sistema es 8.

    • quitar always agregar in your system
    • No en sistemas de 64 bits. Es 8 no. Y hay otros …!
  3. 0

    Creo que es una BUENA idea utilizar los tipos de datos en sizeof en lugar de variables de tipos de datos nativos. modo de uso:

    sizeof(char *)
    • De verdad? Yo prefiero usar la variable, de modo código, por lo general sigue siendo correcto, si cambia el tipo de variable.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea