Przecież to nie będzie działać
Tablica przekazana do funkcji jest widziana jako wskaźnik - sizeof zwróci rozmiar wskaźnika. Jeżeli rozmiar tablicy ma być znany w funkcji to najprościej wysłać go jako argument.
DODANO:
W takich przypadkach (jak są wątpliwości co do działania kodu, a nie ma to w sumie nic wspólnego z mikrokontrolerami - tylko z samym C) można sobie pomóc korzystając z C na PC
Np. kompilatora online - przykład:
klik.
Kod testowy:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Wynik w konsoli:
język bash
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Myślę, że przykład jest całkiem obrazowy
W programie są trzy tablice:
- globalna - 10 intów po 4B -> 40B
- lokalna w main -> 20 intów po 4B -> 80B
- lokalna w funkcji "fun" -> 30 intów po 4B -> 120B
W funkcji main jest sprawdzany rozmiar typu "int" (4B) i wskaźnika (8B). Potem wyświetlany jest wynik sizeof tablicy globalnej i lokalnej - oba wyniki są poprawne (zgodne z oczekiwaniami, pomijam tu dzielenie rozmiaru tablicy przez rozmiar elementu).
Następnie program skacze do funkcji "fun", przekazuje jej dwa argumenty - tablicę globalną (nie ma to większego sensu, chodzi tylko o cele dydaktyczne) i tablicę lokalną z main. W funkcji wywoływany jest:
- sizeof tablicy globalnej - wynik jest ok
- sizeof tablicy globalnej przekazanej do funkcji w argumencie - wynik wynosi 8B (rozmiar wskaźnika)
- sizeof tablicy lokalnej (zadeklarowanej w main) przekazanej jako argument - wynik jw.
- sizeof tablicy lokalnej (zadeklarowanej w funkcji "fun") - wynik jest "zgodny z oczekiwaniem"
Podsumowując - sizeof tablicy działa dobrze jeśli:
- odnosi się do tablicy globalnej
- odnosi się do tablicy lokalnej zadeklarowanej w tym samym bloku (np. funkcji)
Jeśli natomiast size-ofujemy tablicę przekazaną do funkcji (jako argument) to dostajemy rozmiar wskaźnika
Jak gdzieś popłynąłem to proszę krzyczeń i poprawiać