Я прочитал, что calloc (malloc + init) иногда не может инициализировать массив с нулевыми байтами (но все равно будет возвращать указатель на массив malloc'ed). но в documentation он не указывает, что он вернет NULL, есть ли способ убедиться, что массив был инициализирован нулем (лучше, чем перебирать массив), если не в чем преимущество calloc над malloc?Как я могу узнать, не вызвал ли calloc инициализацию
ответ
Если calloc()
возвращает указатель не-NULL, блок памяти будет нулевым.
Если у вас нет библиотеки с багги. В этом случае вы должны осторожно пройтись. И, возможно, подумайте о создании новой инструментальной цепочки, исправьте ошибку (большинство библиотек поставляются с источником) или напишите свою собственную версию calloc()
поверх malloc()
или что-то в этом роде.
Я думаю, что вероятность того, что calloc()
будет твердой, если у вас нет абсолютно древнего, предстандартного компилятора или, может быть, какого-то компилятора, который нацелился на очень маленькие системы, где они чувствовали необходимость вырезать углы Я бы предположил, что они задокументируют).
спасибо, документация должна добавить это, там написано: «Если функция не удалась ** выделить ** запрошенный блок памяти, возвращается указатель NULL.» «- не удалось ** выделить ** не удалось ** инициализации **. –
Ну, если ему удалось выделить его, то подразумевается, что инициализация выполнена. Если вы не можете инициализировать (т. Е. Писать) в блок памяти, который вы, похоже, были выделены, у вас больше проблем. – tangrs
- 1. Могу ли я узнать, кто вызвал скрипт zsh?
- 2. Как я могу узнать, кто вызвал действие в Delphi?
- 3. Как я могу точно узнать, какой объект вызвал мой крах?
- 4. Как узнать, кто вызвал SendMessage?
- 5. Могу ли я задержать декоратор, чтобы я не вызвал функцию?
- 6. Как узнать, кто вызвал метод?
- 7. Как я могу прервать инициализацию объекта?
- 8. Как я могу разрешить инициализацию контекста?
- 9. Как я могу установить инициализацию var C#?
- 10. Как я могу повторить инициализацию бутстрапа datepicker?
- 11. Как я могу узнать, исчез ли GKHostedAuthenticateViewController?
- 12. Как узнать, могу ли я отключить SQLALCHEMY_TRACK_MODIFICATIONS?
- 13. Как я могу узнать, завершено ли GKAchievement?
- 14. Могу ли я определить, вызвал ли объект GC.SuppressFinalize?
- 15. Как я могу узнать, изменилась ли модель?
- 16. Как узнать, какой тег вызвал выбор контроллера?
- 17. Могу ли я узнать, какой домен сделал запрос, который вызвал HttpModule?
- 18. Могу ли я узнать, перезагружен ли ipad?
- 19. Могу ли я узнать, ссылается ли объект?
- 20. Используется ли malloc/realloc/calloc?
- 21. Как я могу заставить GDB сказать, какой адрес вызвал segfault?
- 22. Как узнать, какой объект вызвал SQL Exception
- 23. Как узнать, вызвал ли вызов на сервер обратный вызов?
- 24. Могу ли я сделать простую инициализацию строки с форматом, используя @»
- 25. Могу ли я узнать, не ожидают ли потоки Семафор?
- 26. как я вызвал jqueryDatePicker
- 27. Могу ли я перегрузить неявную инициализацию на 0?
- 28. UIViewController: где я могу поставить пользовательскую инициализацию
- 29. Могу ли я перехватить инициализацию глобального указателя в C?
- 30. Как узнать, какой вид вызвал мой ActionMode?
Ни [справочная страница 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) упоминает это условие. Где вы читали о том, что не удалось установить память? –
_ "Если функции не удалось ** выделить ** запрошенный блок памяти, возвращается указатель NULL." _ ** выделить ** не ** init ** http://www.cplusplus.com/reference/ clibrary/cstdlib/calloc/ –
@samray: стандарт C вполне согласуется с этим, если он не описывает отказ библиотеки (определенным образом), тогда она не может потерпеть неудачу (таким образом). Поэтому вы также можете спросить, что происходит, когда «memset» терпит неудачу, так как спросите, что произойдет, когда 'calloc' не сможет очистить память. Ответ на оба - одно и то же - не разрешено терпеть неудачу. –