2012-04-22 14 views
5

Powiel możliwe:
sizeof array of structs in C?
sizeof an array passed as function argumentC - sizeof int array zawsze zwraca 4

Staram się pisać podstawowe sum() funkcję.

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

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

    return total; 
} 

l zawsze równa się 4 (wiem, aby w końcu podzielić ją przez sizeof int)

Running Dev-C++ z domyślnych opcjach kompilatora w Windows 7.

+2

'arr' jest wskaźnikiem, a nie tablicą. Składnia używana w deklaracji funkcji jest po prostu eye-candy dla 'int sum (int * arr)'. Możesz przeczytać sekcję 6 z [comp.lang.c FAQ] (http://c-faq.com/). – pmg

+0

skompilować na/dla maszyny 64-bitowej powinieneś zobaczyć 8, ponieważ patrzysz na rozmiar wskaźnika, a nie na rozmiar tablicy. –

Odpowiedz

11

Jako argumenty funkcji, tablice rozpad do wskaźników do typu elementu, więc sizeof arr jest sizeof(elem*).

Musisz przekazać liczbę elementów jako dodatkowy argument, nie ma sposobu, aby to ustalić od wskaźnika do pierwszego elementu tablicy (co jest faktycznie przekazywane w tej sytuacji).

+0

Jeśli pytanie zawiera "4", dodaj "sizeof (wskaźnik)"

+0

Jak wskazać samą tablicę zamiast pierwszego elementu? Podanie długości jako drugiego argumentu nie jest słabością, do której powinien się dostosować programista. –

+1

Jeśli masz 'int arr [5];', to '& arr' daje ci wskaźnik do tablicy pięciu' int', 'int (*) [5]'. Adres jest jednak taki sam jak '& arr [0]', adres pierwszego elementu tablicy. Rodzaj wskazanego wskaźnika zależy od sytuacji. Do sumowania elementów tablicy, chyba że chcesz mieć inną funkcję dla każdego rozmiaru ('int sum_5 (int (*) [5]);', 'int sum_6 (int (*) [6]);', masz przekazać 'int *' i liczbę elementów. Tak działa C. –