2010-11-22 15 views
9

Powiel możliwe:
c difference between malloc and callocpreferując malloc nad calloc

Czy istnieje sytuacja, w której wolisz malloc nad calloc. Wiem, że zarówno malloc jak i calloc alokują pamięć dynamicznie, a calloc inicjuje także wszystkie bity w alokowanej pamięci do zera. Na tej podstawie odgadłbym, że zawsze lepiej używać calloc przez malloc. A może są sytuacje, w których malloc jest lepszy? Wydajność może być?

+0

Głosowanie w celu ponownego otwarcia tego. Drugie pytanie dotyczy różnic. To pytanie jest inne. Pyta, dlaczego wolelibyśmy malloc (co jest powszechną praktyką). –

+0

@RaymondHettinger, jeśli dobrze pamiętam, to nie ma znaczenia, czy ich odpowiedzi są takie same. –

Odpowiedz

19

Jeśli potrzebna jest pamięć inicjowana dynamicznie, należy użyć calloc.

Jeśli nie chcesz, aby pamięć przydzielana dynamicznie była inicjowana zerowo, użyj malloc.

Nie zawsze potrzebujesz pamięci inicjowanej zerowo; jeśli nie potrzebujesz inicjowanej pamięci, nie ponawiaj kosztów jej inicjalizacji. Na przykład, jeśli przydzielisz pamięć, a następnie natychmiast skopiujesz dane, aby wypełnić przydzieloną pamięć, nie ma powodu, aby przeprowadzać zerową inicjalizację.

calloc i malloc są funkcjami, które robią różne rzeczy: użyj tego, który jest najbardziej odpowiedni do zadania, które musisz wykonać.

+0

Thanks.performance to dobry punkt. Byłem również zainteresowany wiedząc, czy jest jakikolwiek inny możliwy powód. – user514946

+1

(Ugh ... oni zamknęli twoje pytanie, które jest nieco inne niż "duplikat" ... Nienawidzę czasami S.O.) W każdym razie jest kilka powodów, dla których możesz chcieć użyć calloc przez malloc. Jednym z nich jest program typu valgrind, który wydaje wiele potencjalnie szkodliwych ostrzeżeń za pomocą malloc. Inny wiąże się z ujawnianiem błędów. Używanie niezainicjowanej pamięci może spowodować błędne zachowanie, które może spowodować zauważenie błędu, który w innym przypadku zostałby niezauważony, gdybyś użył calloc. –

2

Opieranie się na inicjalizacji zerowej calloc może być niebezpieczne, jeśli nie jesteś ostrożny. Zerowanie pamięci daje 0 dla typów integralnych i \ 0 dla typów znaków zgodnie z oczekiwaniami. Ale niekoniecznie odpowiada float/double 0 lub NULL pointers.

0

Zazwyczaj przydzielasz pamięć z konkretnym zamiarem przechowywania czegoś. Oznacza to, że (przynajmniej większość) przestrzeni zainicjowanej od zera przez calloc zostanie wkrótce nadpisane innymi wartościami. Jako taki, większość kodu używa malloc dla odrobiny dodatkowej szybkości bez prawdziwej straty.

Prawie jedyne użycie, jakie widziałem dla calloc, było kodem, który był (podobno) porównywaniem prędkości Java w stosunku do C++. W wersji C++ przydzielono trochę pamięci z calloc, a następnie użyto memset, aby ponownie zainicjować pamięć (co wydawało mi się) dość przejrzystą próbą uzyskania wyników, które faworyzowały Javę.