C Language Longitud de la matriz


Ejemplo

Las matrices tienen longitudes fijas que se conocen dentro del alcance de sus declaraciones. Sin embargo, es posible y, a veces, conveniente calcular las longitudes de matriz. En particular, esto puede hacer que el código sea más flexible cuando la longitud de la matriz se determina automáticamente a partir de un inicializador:

int array[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

/* size of `array` in bytes */
size_t size = sizeof(array);

/* number of elements in `array` */
size_t length = sizeof(array) / sizeof(array[0]); 

Sin embargo, en la mayoría de los contextos donde aparece una matriz en una expresión, se convierte automáticamente en ("decae a") un puntero a su primer elemento. El caso en el que una matriz es el operando del operador sizeof es una de las pocas excepciones. El puntero resultante no es en sí mismo una matriz y no transporta ninguna información sobre la longitud de la matriz de la que se derivó. Por lo tanto, si esa longitud se necesita junto con el puntero, como cuando el puntero se pasa a una función, debe transmitirse por separado.

Por ejemplo, supongamos que queremos escribir una función para devolver el último elemento de una matriz de int . Continuando con lo anterior, podríamos llamarlo así:

/* array will decay to a pointer, so the length must be passed separately */
int last = get_last(array, length);

La función se podría implementar así:

int get_last(int input[], size_t length) {
    return input[length - 1];
}

Tenga en cuenta en particular que aunque la declaración de input de parámetros se parece a la de una matriz, de hecho declara la input como un puntero (a int ). Es exactamente equivalente a declarar input como input int *input . Lo mismo sería cierto incluso si se diera una dimensión. Esto es posible porque las matrices nunca pueden ser argumentos reales de las funciones (se descomponen en los punteros cuando aparecen en expresiones de llamada de función), y se pueden ver como mnemotécnicas.

Es un error muy común intentar determinar el tamaño de la matriz desde un puntero, que no puede funcionar. NO HAGAS ESTO:

int BAD_get_last(int input[]) {
    /* INCORRECTLY COMPUTES THE LENGTH OF THE ARRAY INTO WHICH input POINTS: */
    size_t length = sizeof(input) / sizeof(input[0]));

    return input[length - 1];  /* Oops -- not the droid we are looking for */
}

De hecho, ese error en particular es tan común que algunos compiladores lo reconocen y lo advierten. clang , por ejemplo, emitirá la siguiente advertencia:

warning: sizeof on array function parameter will return size of 'int *' instead of 'int []' [-Wsizeof-array-argument]
        int length = sizeof(input) / sizeof(input[0]);
                           ^
note: declared here
int BAD_get_last(int input[])
                     ^