Programowanie w języku C/C++

Calloc

void *calloc(size_t nmemb, size_t size);

Funkcja zwraca wskaźnik do obszaru pamięci przeznaczonego dla tablicy zawierającej nmemb elementów, każdy o rozmiarze size. Zaalokowany obszar pamięci jest inicjowany zerami.

    Dla calloc i malloc, zwracana wartość jest wskaźnikiem do przydzielonej pamięci, który jest właściwie wyrównany dla dowolnego rodzaju zmiennej, lub NULL, gdy żądanie zakończyło się niepowodzeniem.

Przykład:
#include <stdio.h>
#include <stdlib.h>
 
in main(int argc, char* argv[])
{
  char *ptrstr;
  ptrstr = (char*) calloc(100, sizeof(char));
  free(ptrstr);
  return 0;
}

Uwagi


<justify>    Standard Unix98 wymaga, by Cmalloc, calloc i realloc przy wystąpieniu błędu nadawały errno wartość ENOMEM. Glibc zakłada, że tak się dzieje (a wersje tych funkcji zawarte w glibc rzeczywiście to robią). Jeśli wykorzystuje się własną implementację malloc, która nie ustawia errno, to pewne funkcje biblioteczne mogą zawieść bez przekazania przyczyny w errno.</justify>
<justify>    Załamania się w malloc, free czy realloc są niemal zawsze związane z uszkodzeniami sterty, takimi jak przekroczenia rozmiaru przydzielonego fragmentu lub dwukrotne zwolnienie tego samego wskaźnika.</justify>
<justify>    Nowe wersje linuksowej biblioteki libc (późniejsze niż 5.4.23) i GNU libc (2.x) zawierają implementację malloc, którą można dostrajać za pośrednictwem zmiennych środowiskowych. Przy ustawionej zmiennej MALLOC_CHECK_ stosowana jest specjalna (mniej wydajna) implementacja. Zgodnie z zamierzeniami, powinna być bardziej odporna na proste błędy, jak podwójne wywołania free() z tym samym argumentem czy przekroczenia o pojedynczy bajt (błędy off-by-one). Nie chroni jednak przed wszystkimi tego rodzaju błędami, w wyniku których mogą powstać wycieki pamięci. Jeśli MALLOC_CHECK_ ma wartość 0, jakiekolwiek wykryte uszkodzenie sterty zostanie milcząco zignorowane; jeśli ma wartość 1, na stderr wypisywany będzie komunikat diagnostyczny; jeśli ma wartość 2, to natychmiast zostanie wywołane abort(). Może się to przydać, gdyż w przeciwnym razie załamanie się mogłoby wystąpić dużo później, a prawdziwa przyczyna kłopotów byłaby wówczas bardzo trudna do wyśledzenia.</justify>
<justify>    Linux stosuje optymistyczną strategię przydzielania pamięci. Oznacza to, że gdy malloc() zwraca wartość różną od NULL, nie ma gwarancji, iż pamięć faktycznie jest dostępna. Jeśli okaże się, że systemowi zabrakło pamięci, niesławny zabójca OOM zabije jeden lub więcej procesów.</justify>