C Language Lunghezza della matrice

Esempio

Gli array hanno lunghezze fisse che sono note nell'ambito delle loro dichiarazioni. Tuttavia, è possibile ea volte conveniente calcolare le lunghezze degli array. In particolare, questo può rendere il codice più flessibile quando la lunghezza dell'array viene determinata automaticamente da un inizializzatore:

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]); 

Tuttavia, nella maggior parte dei contesti in cui un array appare in un'espressione, viene automaticamente convertito in ("decays to") un puntatore al suo primo elemento. Il caso in cui un array è l'operando dell'operatore sizeof è uno di un piccolo numero di eccezioni. Il puntatore risultante non è di per sé un array e non contiene alcuna informazione sulla lunghezza dell'array da cui è stato derivato. Pertanto, se tale lunghezza è necessaria insieme al puntatore, ad esempio quando il puntatore viene passato a una funzione, deve essere convogliato separatamente.

Ad esempio, supponiamo di voler scrivere una funzione per restituire l'ultimo elemento di una matrice di int . Continuando da quanto sopra, potremmo chiamarlo così:

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

La funzione potrebbe essere implementata in questo modo:

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

Si noti in particolare che sebbene la dichiarazione input dei parametri sia simile a quella di un array, in realtà dichiara l' input come un puntatore (su int ). È esattamente equivalente a dichiarare input come input int *input . Lo stesso sarebbe vero anche se venisse data una dimensione. Ciò è possibile perché gli array non possono mai essere argomenti reali delle funzioni (decadono in base ai puntatori quando compaiono nelle espressioni di chiamata di funzione) e possono essere visualizzati come mnemonici.

È un errore molto comune tentare di determinare la dimensione dell'array da un puntatore, che non può funzionare. NON FARLO:

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 */
}

In effetti, quel particolare errore è così comune che alcuni compilatori lo riconoscono e lo mettono in guardia. clang , ad esempio, emetterà il seguente avviso:

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[])
                     ^