Comportamiento de Sizeof en C

3 minutos de lectura

Aprendí que cuando pasamos el nombre de la matriz a sizeof, el nombre de la matriz no se descompone en el puntero a la dirección base. El siguiente código verifica este hecho al dar la respuesta 10.

#include <stdio.h> 

int main(){  
    int arr[10];  
    printf("Size of array is %d" , sizeof(arr)/sizeof(int));  
    return 0;  
}

Sin embargo, cuando ejecuto el siguiente código, la respuesta es 1. Independientemente de si una dimensión está escrita en prototipo o no, la respuesta es 1. ¿Por qué es así?

#include <stdio.h>

void dimension(int arr[]){  
    printf("Sizof array is %d" , sizeof(arr)/sizeof(int));  
}


int main(){  
    int arr[10];  
    dimension(arr);  
    return 0;  
}  

  • El estándar dice que el nombre de la matriz en los argumentos de una función se considerará como un puntero. Entonces int arr[] sera int *arry int arr[][10] sera int (*p)[10] (tamaño restante de un puntero). Aparte: sizeof(arr)/sizeof(arr[0]) es mejor, cuando cambies el tipo de arr, no tendrás que modificar este lugar.

    – Stan

    25 de julio de 2011 a las 8:46

  • @Stan: Debería haber sido una respuesta, creo.

    – Sebastián Mach

    25 de julio de 2011 a las 9:02

  • Produce 1 porque está trabajando en un entorno de 32 bits donde sizeof(void *) == sizeof(int); en entornos de 64 bits, produciría 2 normalmente porque un puntero tiene 8 bytes pero int queda 4 bytes.

    –Jonathan Leffler

    25 de julio de 2011 a las 22:29

  • posible duplicado de Sizeof una matriz en el lenguaje de programación C?

    – Bo Person

    6 de agosto de 2012 a las 21:24

esta firma

void dimension(int arr[])

es absolutamente equivalente a

void dimension(int *arr)

Ver también Pregunta 6.4

Porque pasa una matriz de tamaño desconocido que es equivalente a un puntero en este contexto. sizeof se calcula en compilar tiempo, no tiempo de ejecución.

  • A excepción de la matriz de longitud variable (VLA) en C99, sizeof funciona como lo que dijiste.

    – Stan

    25 de julio de 2011 a las 8:49

Comportamiento de Sizeof en C
MByD

Cuando se pasa una matriz a una función, se pasa como un puntero, no como una matriz, por lo que el sizeof(arr) regresará sizeof(int *)

  • no es del tamaño de un int en x64

    – unkulunkulu

    25 de julio de 2011 a las 8:40

  • @unkulunkulu: depende, y por eso dije generalmente.

    – MByD

    25 de julio de 2011 a las 8:46

  • No me di cuenta de la palabra “normalmente” 🙂

    – unkulunkulu

    25 de julio de 2011 a las 8:50

  • de todos modos, no puedes decir “usualmente” si no es correcto para x64 😀

    – unkulunkulu

    25 de julio de 2011 a las 8:51

  • “a menudo” podría ser un sustituto más apropiado, supongo. Pero solo estoy defendiendo la eliminación de esa parte entre paréntesis 🙂

    – unkulunkulu

    25 de julio de 2011 a las 8:53

1647699968 2 Comportamiento de Sizeof en C
Sebastián Mach

En

void dimension(int arr[]){  
    printf("Sizof array is %d" , sizeof(arr)/sizeof(int));  
}

arr[] se descompone en un puntero, por lo tanto, tiene el equivalente de

printf("Sizof array is %d" , sizeof(int*)/sizeof(int));

y porque en tu plataforma, sizeof(int*) == sizeof(int)usted recibe 1 como el resultado.

Tenga en cuenta, sin embargo, que para matrices de longitud variable, sizeof se convierte en una operación de tiempo de ejecución:

int main () {
    int i = ...;
    int x[i];
    printf("number of elements: %d", sizeof (x) / size(*x));
}

Matrices como argumentos de función hacer decaer a puntero, sin embargo. Dado que esto sucede antes de que se llame a sizeof(), no puede evitarlo.

Solo piénselo: ¿cómo puede sizeof() saber el tamaño de una matriz si se puede pasar una matriz de cualquier tamaño y no hay información adicional disponible? Obtiene sizeof (puntero), y parece ser del mismo tamaño que un int, en su configuración.

Comportamiento de Sizeof en C
DhruvPathak

porque arr es un puntero, que es un número entero.

1647699968 8 Comportamiento de Sizeof en C
Mehmet Fatih Tabak

Porque estás pasando una matriz de tamaño desconocido.

  • Debe proporcionar un poco más de explicación que “Porque estás pasando una matriz de tamaño desconocido” para ganar reputación. El núcleo de la respuesta es básicamente correcto, pero no lo suficientemente útil para puntuar.

    –Jonathan Leffler

    25 de julio de 2011 a las 22:31

¿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