Temat: Jak się obchodzić ze wskaźnikami

Aby zminimalizować ryzyko wystąpienia błędu podczas pracy ze wskaźnikami proponuję stosowanie następujących zabiegów w programach:

Gwiazdkę oznaczającą wskaźnik piszemy bliżej nazwy typu, a nie nazwy zmiennej.

int* wsk;  //zamiast int *wsk lub int * wsk

Nie ma to znaczenia dla kompilatora, ale "wsk jest typu wskaźnik na int" wydaje się łatwiejsze w zrozumieniu niż "to na co wskazuje wsk jest typu int".

Taki zapis sprawia również, że łatwiejsze w odczycie stają się typy zwracane przez funkcje oraz ich argumenty wywołania.

int* generujTablice(int rozmiar, int wartoscMin, int wartoscMax);
int progowanie(struct Obraz* obr, int prog);

Każdy nowo zadeklarowany wskaźnik inicjujemy wartością NULL.
Uchroni nas to przed próbą wykorzystania wskaźnika, który nie został do niczego konkretnego przypisany.

Stosujemy to zarówno w przypadku pojedynczych wskaźników:

int* w = NULL;

Jak również dla wskaźników będących elementami większych struktur:

struct Wektor {
   int wielkosc;
   int* liczby;
};

void main(void) {
   struct Wektor w1;
   w1.liczby = NULL;
}

Przed wykonywaniem operacji na danych, na które pokazuje wskaźnik, sprawdzamy czy nie ma on wartości NULL.

Zwalniając zaalokowaną pamięć, oprócz wywołania funkcji free(), wpisujemy do zmiennej wskaźnikowej wartość NULL.
(funkcja free() powoduje jedynie zwolnienie pamięci, do której adres dostaje, nie jest w stanie zmienić tego adresu na NULL)

if (wsk != NULL) {
   free(wsk);
   wsk = NULL;
}