Када цаллоц користи се за доделу блока меморије, додељена регија се иницијализира на нула. У супротности, маллоц не додирује садржај додељеног блока меморије, што значи да садржи вредности смећа. То може потенцијално бити безбедносни ризик, јер је садржај меморије непредвидив, а грешке у програмирању могу резултирати цурењем тих садржаја.
цаллоц | маллоц | |
---|---|---|
Функција | додељује област меморије довољно велика да држи „н елементе“ величине „величине“. Такође инициализира садржај меморије на нуле. | додељује "величину" бајтова меморије. |
Број аргумената | 2 | 1 |
Синтакса | воид * цаллоц (број_оф_блокова, величина_оф_еацх_блоцк_ин_бајта); | воид * маллоц (сизе_ин_битес); |
Садржај додељене меморије | Додељени регион се иницијализира на нулу. | Садржај додељене меморије се не мења. тј. меморија садржи непредвидиве или смеће вриједности. Ово представља ризик. |
Повратна вредност | воид поинтер (воид *). Ако додељивање успе, враћа се показивач на блок меморије. Ако додељивање меморије не успе, враћа се показивач НУЛЛ. | воид поинтер (воид *). Ако додељивање успе, враћа се показивач на блок меморије. Ако додељивање меморије не успе, враћа се показивач НУЛЛ. |
воид * маллоц (сизе_т сизе);
издваја величина
бајтова меморије. Ако додељивање успе, враћа се показивач на додељену меморију. Иначе НУЛА
је враћен. Пример:
/ * Додијелите меморију за низ са 15 елемената типа инт. * / инт * птр = маллоц (15 * сизеоф (инт)); ако (птр == НУЛЛ) / * Меморија се не може доделити, па испишите грешку и изађите. * / фпринтф (стдерр, "Не могу доделити меморију \ н"); излаз (ЕКСИТ_ФАИЛУРЕ); / * Додјела је успјела. * /
Напоменути да маллоц
захтева да израчунамо бајте потребне меморије и проследимо то као аргумент маллоцу.
воид * цаллоц (величина_т нелементс, величина_т бајтова);
додељује непрекидни блок меморије који је довољно велик да држи нелементс
величине бајтова
сваки. Додељени регион се иницијализира на нулу. У горњем примеру:
/ * Додијелите простор за низ с 15 елемената типа инт и иницијализовати до нуле. * / инт * птр = цаллоц (15, величина (инт)); ако (птр == НУЛЛ) / * Меморија се не може доделити, па испишите грешку и изађите. * / фпринтф (стдерр, "Не могу доделити меморију \ н"); излаз (ЕКСИТ_ФАИЛУРЕ); / * Додјела је успјела. * /
цаллоц (м, н) је исто што и
п = маллоц (м * н); иф (п) мемсет (п, 0, м * н);
Овај видео водич објашњава функције расподјеле меморије маллоц
, цаллоц
и реаллоц
, као и функцију раздвајања меморије бесплатно
:
Генерално је добра идеја да се користи цаллоц
преко маллоц
. Када користите маллоц, садржај додељене меморије је непредвидив. Грешке у програмирању могу узроковати да ови меморијски садржаји пропуштају ненамјерно, али веома рањиви. Добар пример таквог пропуштања је Хеартблеед рањивост у ОпенССЛ-у, чији је основни механизам објашњен у овом КСКЦД стрипу, а још неколико техничких детаља је у овом посту на блогу.
цаллоц је мало спорији од маллока због додатног корака иницијализације додељене меморијске регије. Међутим, у пракси је разлика у брзини врло мала и може се занемарити.