2012-02-15 2 views
2

Я прочитал, что calloc (malloc + init) иногда не может инициализировать массив с нулевыми байтами (но все равно будет возвращать указатель на массив malloc'ed). но в documentation он не указывает, что он вернет NULL, есть ли способ убедиться, что массив был инициализирован нулем (лучше, чем перебирать массив), если не в чем преимущество calloc над malloc?Как я могу узнать, не вызвал ли calloc инициализацию

+0

Ни [справочная страница Linux] (http://linux.die.net/man/3/calloc), [страница руководства MSDN] (http://msdn.microsoft.com/en-us/library /3f8w183e(v=vs.100).aspx) или [страница руководства POSIX] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/calloc.html) упоминает это условие. Где вы читали о том, что не удалось установить память? –

+0

_ "Если функции не удалось ** выделить ** запрошенный блок памяти, возвращается указатель NULL." _ ** выделить ** не ** init ** http://www.cplusplus.com/reference/ clibrary/cstdlib/calloc/ –

+0

@samray: стандарт C вполне согласуется с этим, если он не описывает отказ библиотеки (определенным образом), тогда она не может потерпеть неудачу (таким образом). Поэтому вы также можете спросить, что происходит, когда «memset» терпит неудачу, так как спросите, что произойдет, когда 'calloc' не сможет очистить память. Ответ на оба - одно и то же - не разрешено терпеть неудачу. –

ответ

4

Если calloc() возвращает указатель не-NULL, блок памяти будет нулевым.

Если у вас нет библиотеки с багги. В этом случае вы должны осторожно пройтись. И, возможно, подумайте о создании новой инструментальной цепочки, исправьте ошибку (большинство библиотек поставляются с источником) или напишите свою собственную версию calloc() поверх malloc() или что-то в этом роде.

Я думаю, что вероятность того, что calloc() будет твердой, если у вас нет абсолютно древнего, предстандартного компилятора или, может быть, какого-то компилятора, который нацелился на очень маленькие системы, где они чувствовали необходимость вырезать углы Я бы предположил, что они задокументируют).

+0

спасибо, документация должна добавить это, там написано: «Если функция не удалась ** выделить ** запрошенный блок памяти, возвращается указатель NULL.» «- не удалось ** выделить ** не удалось ** инициализации **. –

+3

Ну, если ему удалось выделить его, то подразумевается, что инициализация выполнена. Если вы не можете инициализировать (т. Е. Писать) в блок памяти, который вы, похоже, были выделены, у вас больше проблем. – tangrs

Смежные вопросы