¿Cómo puedo encontrar el número de elementos en una matriz?

5 minutos de lectura

avatar de usuario
andresp

Yo tengo un int array y necesito encontrar el número de elementos en él. Sé que tiene algo que ver con sizeof pero no estoy seguro de cómo usarlo exactamente.

  • Mira esto. stackoverflow.com/questions/4081100/…

    – dos249

    24 de abril de 2012 a las 1:34


  • Si está en MSVC, tiene _countof

    – Mahmud Al-Qudsi

    24 de abril de 2012 a las 1:42

  • Si bien todos tienen la solución, quiero señalar que es muy probable que no haya forma de encontrar el tamaño de una matriz dinámica a menos que haya registrado el tamaño porque el tamaño de (a) del puntero a es el tamaño del puntero int *a = new int[10] en este caso encontrar sizeof(*a) es de 4 bytes. Por lo tanto, es importante mantener el control del tamaño de su matriz.

    – CppLearner

    24 de abril de 2012 a las 2:07


Si tiene su matriz en el alcance, puede usar sizeof para determinar su tamaño en bytes y usar la división para calcular el número de elementos:

#define NUM_OF_ELEMS 10
int arr[NUM_OF_ELEMS];
size_t NumberOfElements = sizeof(arr)/sizeof(arr[0]);

Si recibe una matriz como argumento de función o asigna una matriz en el montón, no puede determinar su tamaño usando el sizeof. Tendrá que almacenar/pasar la información de tamaño de alguna manera para poder usarla:

void DoSomethingWithArray(int* arr, int NumOfElems)
{
    for(int i = 0; i < NumOfElems; ++i) {
        arr[i] = /*...*/
    }
}

avatar de usuario
shengy

int a[20];
int length;
length = sizeof(a) / sizeof(int);

y puede usar otra forma de hacer que su código no esté codificado para int

Di si tienes una matriz array

solo necesitas:

int len = sizeof(array) / sizeof(array[0]);

Personalmente, creo que sizeof(a) / sizeof(*a) se ve más limpio.

También prefiero definirlo como una macro:

#define NUM(a) (sizeof(a) / sizeof(*a))

Entonces puedes usarlo en for-loops, así:

for (i = 0; i < NUM(a); i++)

  • Podría hacer esto, pero daría como resultado calcular el tamaño cada vez que realiza la prueba en el ciclo for, por lo tanto, una vez en cada iteración. Y así estaría haciendo la división cada vez a través del bucle. Sería más eficiente asignar el resultado de NUM(a) a una variable de instancia justo encima del ciclo y use ese valor en el ciclo.

    – Gavin

    4 de marzo de 2014 a las 16:42

  • @Gavin no, no calcularía el tamaño para cada iteración. El compilador es lo suficientemente inteligente como para ver que los resultados de cada tamaño y la división son constantes y determina el resultado en el momento de la compilación, que luego compila en el código como un número constante. Es posible que haya sido engañado por el aspecto de la sizeof aplicación, que parece una función debido a los paréntesis, pero no es una función. sizeof es un operador y los paréntesis son solo una convención.

    – blubberdiblub

    27/09/2016 a las 22:17


avatar de usuario
Shyam

No es posible encontrar el número de elementos en una matriz a menos que sea una matriz de caracteres. Considere el siguiente ejemplo:

int main()
{
    int arr[100]={1,2,3,4,5};
    int size = sizeof(arr)/sizeof(arr[0]);
    printf("%d", size);
    return 1;
}

El valor anterior nos da el valor 100 incluso si el número de elementos es cinco. Si se trata de una matriz de caracteres, puede buscar linealmente la cadena nula al final de la matriz y aumentar el contador a medida que avanza.

avatar de usuario
Ningún hombre

En realidad, no podemos contar cuántos elementos se almacenan en la matriz

Pero puede encontrar la longitud o el tamaño de la matriz usando el operador sizeof.

Pero, ¿por qué no podemos encontrar cuántos elementos están presentes en mi matriz?

Porque cuando inicializamos un compilador de matrices, le damos memoria a nuestro programa como un[10] (10 bloques de 4 tamaños) y cada bloque tiene valor basura si ponemos algún valor en algún índice como un[0]=1,a[1]=2,a[3]=8; y otro bloque tiene basura valor nadie puede decir qué valor es basura y qué valor no es basura esa es la razón por la que no podemos calcular cuántos elementos en una matriz. Espero que esto te ayude a entender. pequeño concepto

Muy facil.

Simplemente divida la cantidad de bytes asignados por la cantidad de bytes del tipo de datos de la matriz usando sizeof().

Por ejemplo, dada una matriz de enteros llamada myArray

int numArrElements = sizeof(myArray) / sizeof(int);

Ahora, si el tipo de datos de su matriz no es constante y posiblemente podría cambiar, entonces haga que el divisor en la ecuación use el tamaño del primer valor como el tamaño del tipo de datos.

Por ejemplo:

int numArrElements = sizeof(myArray) / sizeof(myArray[0]);

De esta manera, el código es independiente del tipo y funcionará correctamente sin importar el tipo de datos de la matriz.

Usé el siguiente código como se sugirió anteriormente para evaluar la cantidad de elementos en mi matriz bidimensional:

#include <stdio.h>
#include <string.h>

void main(void)
{
    char strs[3][20] =
    {
        {"January"},
        {"February"},
        {""}
    };

    int arraysize = sizeof(strs)/sizeof(strs[0]);

    for (int i = 0; i < arraysize; i++)
    {
        printf("Month %d is: %s\n", i, strs[i]);
    }

}

Funciona muy bien. Por lo que sé, no puede mezclar diferentes tipos de datos en matrices C y también debe tener el mismo tamaño de todos los elementos de la matriz (si no me equivoco), por lo tanto, puede aprovechar eso con este pequeño truco:

  1. cuente el número de bytes con la función sizeof () de toda la matriz 2d (en este caso, 3 * 20 = 60 bytes)
  2. cuente el número de bytes con la función sizeof () desde el primer elemento de matriz strs[0] (en este caso 20 bytes)
  3. divida el tamaño completo con el tamaño de un elemento, lo que le dará la cantidad de elementos

Este recorte debería ser portátil para matrices 2d en C; sin embargo, en otros lenguajes de programación no podría funcionar porque puede usar diferentes tipos de datos dentro de la matriz con diferentes tamaños (como en JAVA).

¿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