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?
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
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
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.
DhruvPathak
porque arr es un puntero, que es un número entero.
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?
Tu feedback nos ayuda a saber si la solución es correcta y está funcionando. De esta manera podemos revisar y corregir el contenido.
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
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[]
seraint *arr
yint arr[][10]
seraint (*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 peroint
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