добавляет Это в основном только к существующему ответу, но я понимаю, где вы и откуда, если вы делаете много выделения памяти вашего код заканчивает тем, что очень некрасиво со всеми проверками ошибок для таНоса.
Лично я часто обойдусь этим, используя небольшую обертку malloc, которая никогда не потерпит неудачу. Если ваше программное обеспечение не является устойчивой, безопасность критической системы не может нормально работать вокруг таНоса неисправного в любом случае, так что я хотел бы предложить что-то вроде этого:
static inline void *MallocOrDie(size_t MemSize)
{
void *AllocMem = malloc(MemSize);
/* Some implementations return null on a 0 length alloc,
* we may as well allow this as it increases compatibility
* with very few side effects */
if(!AllocMem && MemSize)
{
printf("Could not allocate memory!");
exit(-1);
}
return AllocMem;
}
Что будет, по крайней мере убедиться, что вы получите сообщение об ошибке и чистую аварию, и избежать всех основная часть кода проверки ошибок.
Для более общего решения для функций, которые могут не я также, как правило, для реализации простой macrosuch как это:
#define PrintDie(...) \
do \
{ \
fprintf(stderr, __VA_ARGS__); \
abort(); \
} while(0)
Который затем позволяет запускать функцию как:
if(-1 == foo()) PrintDie("Oh no");
Каких дает вам один лайнер, снова избегая массового объема, обеспечивая надлежащую проверку.
Теоретически, да. В действительности, если malloc не работает, операционная система, вероятно, вот-вот рухнет. PS: Ваш второй пример гораздо труднее прочитать, чем первый, и он должен быть отклонен просмотром кода. –
'arr = (int) malloc (...)' неверно, 'malloc' возвращает указатель. Кроме того: да, вы должны проверить, не сработает ли он, потому что он может выйти из строя. [Также, литье его возвращаемого значения вредно.] (Https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc/605858#605858) –
1. Вам не требуется бросать. 2. Да проверить - почему бы и нет –