2012-04-22 16 views
5

Eventuali duplicati:
sizeof array of structs in C?
sizeof an array passed as function argumentC - sizeof int matrice restituisce sempre 4

Solo cercando di scrivere una funzione di base sum().

int sum(int arr[]) { 
    int total = 0 , i = 0 , l = sizeof arr; 

    for(i=0;i<l;i++) { 
     total += arr[i]; 
    } 

    return total; 
} 

l equivale sempre a 4 (lo so per poi dividerlo per sizeof int)

Esecuzione Dev-C++ con opzioni del compilatore di default in Windows 7.

+2

'arr' è un puntatore, non un array. La sintassi che si usa nella dichiarazione di funzione è solo per gli occhi per 'int sum (int * arr)'. Ti potrebbe interessare leggere la sezione 6 delle [domande frequenti su comp.lang.c (http://c-faq.com/). – pmg

+0

compile su/per una macchina a 64 bit dovresti vedere 8 mentre stai guardando le dimensioni del puntatore e non le dimensioni dell'array. –

risposta

11

Come argomenti delle funzioni, array di decadimento a puntatori al tipo di elemento, quindi sizeof arr è sizeof(elem*).

È necessario passare il numero di elementi come argomento aggiuntivo, non esiste alcun modo per determinarlo dal puntatore al primo elemento dell'array (che è ciò che viene effettivamente passato in tale situazione).

+0

Se la domanda contiene "4", inserisci "sizeof (puntatore)"

+0

Come faccio a puntare alla matrice stessa anziché al primo elemento? Passare la lunghezza come seconda argomentazione non è una debolezza a cui un programmatore dovrebbe adattarsi. –

+1

Se hai 'int arr [5];', quindi '& arr' ti dà un puntatore a un array di cinque' int', 'int (*) [5]'. L'indirizzo è, tuttavia, lo stesso di '& arr [0]', l'indirizzo del primo elemento dell'array. Che tipo di puntatore vuoi dipende dalla situazione. Per sommare gli elementi dell'array, a meno che tu non voglia avere una funzione diversa per ogni dimensione ('int sum_5 (int (*) [5]);', 'int sum_6 (int (*) [6]);', hai per passare un 'int *' e il numero di elementi, ecco come funziona C. –