wtorek, 14 lutego 2017

C - Poprawne wykorzystywanie funkcji sizeof

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:

  1. int i = 0;
  2. int DataBuffer[30];
  3. int *DataBufferPoint = DataBuffer;
  4. for (= O;i<sizeof(DataBuffer); i++)
  5. {
  6.     *(DataBufferPoint++) = Ox01;
  7. }

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:

  1. char UsartSendData[40];
  2. int StringBuffer[32];
  3. sprintf(UsartSendData, "StringBuffer:%u | %u | %u | %u",
  4.    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:

  1.  char StringBuffer[32];
  2.  memset(StringBuffer, 0x00, sizeof(StringBuffer)/sizeof(char));

To samo co:

  1.  char StringBuffer[32];
  2.  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.

  1. int StringBuffer[32];
  2. memset(StringBuffer, 0x00, sizeof(StringBuffer)/sizeof(int));