Calloc

phoenix20_pl
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 [[C/calloc]] i [[C/malloc]], zwracana wartość jest wskaźnikiem do przydzielonej pamięci, który jest właściwie wyrównany dla dowolnego rodzaju zmiennej, lub [[C/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]], [[C/calloc]] i [[C/realloc]] przy wystąpieniu błędu nadawały [[C/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 [[C/errno]], to pewne funkcje biblioteczne mogą zawieść bez przekazania przyczyny w [[C/errno]].</justify> <justify> Załamania się w [[C/malloc]], [[C/free]] czy [[C/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 [[C/abort|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 [[C/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>

0 komentarzy