Pregunta sobre el tamaño de variables de puntero entero en C [duplicar]

Escribí este programa muy simple para comprobar el tamaño de punteros enteros en c.

#include 

int main(void) {
    
    int i = 10;
    int* i_ptr = &i    
    int arr[3] = {13, 14, 15};

    printf("\n ... Size of an integer pointer is: %ld bytes and %ld bits ...", sizeof(i_ptr), 8*sizeof(i_ptr));    
    printf("\n\n ... Size of a 3-element integer array is: %ld bytes and %ld bits ...\n\n", sizeof(arr), 8*sizeof(arr));
    printf(" ... Size of the *arr element is: %ld bytes and %ld bits ...\n\n", sizeof(*arr), 8*sizeof(*arr));

    return 0;
}

La salida con respecto al tamaño de las diferentes variables fue:

... Size of an integer pointer is: 8 bytes and 64 bits ...

... Size of a 3-element integer array is: 12 bytes and 96 bits ...

... Size of the *arr element is: 4 bytes and 32 bits ...

Ahora, mis preguntas son las siguientes. Como estoy ejecutando un sistema operativo linux de 64 bits, entiendo que el tamaño de una variable puntero entero es de 64 bits de largo. El tamaño de la matriz entero es de 12 bytes ya que un entero toma 4 bytes de memoria y la matriz consiste de 3 enteros. Sin embargo, cuando pienso que un array es básicamente un puntero en C y la variable de los puntos del array al primer elemento del array, se supone que el tamaño del array se asemejaría al tamaño de los punteros correspondientes. Sin embargo, también entiendo que esto no significa que el tamaño de la matriz sería de 24 bytes mientras el tamaño de 3 punteros enteros. Esto me parece un poco confuso, así que cualquier consejo sería apreciado.

Pregunta hecha hace 3 años, 4 meses, 27 días - Por quantumcoderd26d


3 Respuestas:

  • Los rayos no son punteros. Si declara un objeto de un tipo de array entonces su tamaño es igual al número de bytes ocupados por los elementos del array.

    Pero diseñadores de array usados en expresiones con raras excepciones como por ejemplo utilizados como operandos de los sizeof el operador se convierte en punteros a sus primeros elementos.

    De la norma C (6.3.2.1 Lvalues, arrays y designadores de funciones)

    3 Excepto cuando es el operado del tamaño del operador o el único operador, o es una cadena literal utilizada para inicializar un array, un expresión que tiene tipo de ‘rayo de tipo’ se convierte en expresión con el tipo ‘punto a escribir’ que apunta a la inicial elemento del objeto array y no es un valor l. Si el objeto array tiene clase de almacenamiento registrado, el comportamiento no está definido.

    Respondida el Dec 18, 2020 a las 19:48 - por syntaxsensei8acf

    Votos positivos: 0 | Votos negativos: 0

  • En C, un puntero a un tipo de dato tiene un tamaño que depende de la arquitectura del sistema en el que se está ejecutando. En un sistema operativo de 64 bits, un puntero a un entero generalmente tendrá un tamaño de 8 bytes (64 bits), por lo que la salida que obtuviste al comprobar el tamaño de i_ptr está correcta.

    Por otro lado, al declarar un array en C, el tamaño del array se calcula multiplicando el tamaño del tipo de dato por el número de elementos en el array. En tu caso, tienes un array de 3 enteros, por lo que el tamaño del array arr será 3 * tamaño del entero (que es 4 bytes) = 12 bytes. Esto explica la salida que recibiste al imprimir el tamaño de arr.

    La confusión puede venir de la diferencia entre un puntero a un entero y un array de enteros en C. Mientras que un array se representa como un bloque contiguo de memoria que contiene los elementos del array, un puntero simplemente almacena la dirección de memoria de una variable.

    Es importante recordar que en C, un array no es exactamente lo mismo que un puntero. Aunque un array se puede tratar como un puntero en muchos contextos, tienen diferencias sutiles en su comportamiento y en cómo se manejan en memoria.

    Espero que esta explicación aclare tus dudas. ¡Déjame saber si necesitas más ayuda!

    Respondida el Dec 19, 2020 a las 19:46 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El tamaño de una matriz no es el mismo que el tamaño de un puntero a su primer elemento.

    Tamaño de un puntero

    En un sistema de 64 bits, el tamaño de un puntero es de 8 bytes. Esto se debe a que un puntero almacena la dirección de una variable, y en un sistema de 64 bits, las direcciones se almacenan en valores de 64 bits.

    Tamaño de una matriz

    El tamaño de una matriz es el tamaño total de todos sus elementos. En el ejemplo proporcionado, la matriz arr contiene 3 elementos enteros. Cada entero ocupa 4 bytes, por lo que el tamaño total de la matriz es 3 <strong> 4 = 12 bytes.

    Punteros y matrices

    Aunque una matriz se puede tratar como un puntero a su primer elemento, sigue siendo una entidad distinta. Cuando se pasa una matriz a una función como argumento, en realidad se pasa un puntero a su primer elemento. Sin embargo, el tamaño de la matriz no cambia porque todavía contiene el mismo número de elementos.

    En resumen:

    El tamaño de un puntero es el tamaño del valor que almacena (generalmente una dirección de memoria). El tamaño de una matriz es el tamaño total de todos sus elementos. Tratar una matriz como un puntero no cambia su tamaño.

    Respondida el Dec 19, 2020 a las 19:50 - por Gemini

    Votos positivos: 0 | Votos negativos: 0