W tym poście chciałbym krótko opisać poprawny sposób wykorzystywanie operatora sizeof w kontakcie z tablicami.
Funkcja sizeof określa wielkość danego argumentu, który jest prezentowany w bajtach. Wartość zwracana jest stała, może ona zostać przygotowana przez program na etapie kompilacji.
Przykład 1:
Poniżej krótka funkcja prezentująca dane:
- int i = 0;
- int DataBuffer[30];
- int *DataBufferPoint = DataBuffer;
- for (i = O;i<sizeof(DataBuffer); i++)
- {
- *(DataBufferPoint++) = Ox01;
- }
Funkcja wykona się błędnie, ponieważ w zależności od kompilatora ta wartość będzie wynosiła od 60 do 120. Dlatego jeśli chce się uzyskać rozmiar bufora należy posłużyć się sizeof(DataBuffer)/sizeof(int). Co pozwoli na wyliczenie liczby elementów.
Przykład 2:
Prezentacja danych od operatora sizeof:
- char UsartSendData[40];
- int StringBuffer[32];
- sprintf(UsartSendData, "StringBuffer:%u | %u | %u | %u",
- sizeof(StringBuffer), sizeof(char) ,sizeof(StringBuffer)/sizeof(int), sizeof(int));
Powyższa funkcja po wyprowadzeniu buffora na ekran wyświetli odpowiednio jako pierwsze 64 (ponieważ tablica jest typu int, może też być inna liczba w zależności od programu), 1 (jest to rozmiar zmiennej char), 32 (ponieważ taka jest ilość znaków) i na końcu 2 (taki rozmiar ma wartość int w wykorzystywanym przezemnie kompilatorze)
Podobna zasada się tyczy funkcji memset. Gdy chcemy wprowadzić dane do konkretnego bufora:
- char StringBuffer[32];
- memset(StringBuffer, 0x00, sizeof(StringBuffer)/sizeof(char));
To samo co:
- char StringBuffer[32];
- memset(StringBuffer, 0x00, sizeof(StringBuffer));
Rozmiar char wynosi 1 wobec tego nie trzeba dzielić przez tą wartość. Natomiast dla tablicy danych int już taką operację należy wykonać ponieważ uzyska się większy rozmiar niż ilość elementów.
- int StringBuffer[32];
- memset(StringBuffer, 0x00, sizeof(StringBuffer)/sizeof(int));