Wpis z mikrobloga

#programowanie #ciekawostkijezykac

0x0003 NOTE TO MYSELF Arytmetyka wskaznikowa mocno zalezy od typu wskaznika. Oznacza to, ze jesli mamy strukture:

typedef struct {
char name[10];
char category_char;
} definition_t;

ktos moze pomyslec, ze majac tablice

definition_t* def = get_definitions(def_id);
mozemy przesunac sie do kolejnego pola przez

def += sizeof(definition_t);
jednak jest to blad, bo powinnismy zrobic

def += 1; // lub def++
W tej sytuacji moze sie on wydawac oczywisty, ale przy roznego rodzaju rpc, czesto dostajemy struktury w buforach char* ktore czesto maja dynamiczne rozmiary, czyli pierwszy element w liscie ma 16 bajtow a kolejny np. 48. Trzeba uwazac zatem kiedy przesuwamy wskaznik, aby sprawdzic jakiego jest typu.

char* buffer = //...
get_items(&query, sizeof(query), buffer, &buflen);

item_t* items = (item_t*)buffer; // tu robi sie niebezpiecznie
for (int i=0; inumber_of_elements; i++) {
register_item(item);
// struktura posiada liste roznych "podtypow", ktore sa rozrozniane w register_item()
// napisanie item += item->size; wydaje sie naturalne, ale jednak trzeba napisac
item = (*item)((*char)item + item->size);
// bo += item->size przesunie nam o size * sizeof(time_t) bajtow
}

---

Czesc. Jestem programista Javy, ale ostatnio przyszlo mi napisac troche kodu w C. Spowodowalo to, ze musze troche odkurzyc swoja wiedze na ten temat. Spotkalem kilka ciekawostek którymi chcialbym sie z wami podzielic, jak równiez opisac miejsca gdzie najczesciej popelnialem bledy, przyjmujac milczaco jakiestam zalozenia.

Jesli poziom tych wpisów jest za niski, wrzuc #ciekawostkijezykac na #czarnolisto. Jesli widzisz natomiast blad, zapraszam do konstruktywnej krytyki. Nie mam zamiaru czytac tu zadnego hejtu, ani na niego odpowiadac.

---