¿Debo verificar si malloc () fue exitoso?

¿Debería uno verificar después de cada malloc () si fue exitoso? ¿Es posible que un malloc () falle? ¿Qué pasa entonces?

En la escuela nos dijeron que deberíamos verificar, es decir:

arr = (int) malloc(sizeof(int)*x*y); if(arr==NULL){ printf("Error. Allocation was unsuccessful. \n"); return 1; } 

¿Cuál es la práctica con respecto a esto? ¿Puedo hacerlo de esta manera?

 if(!(arr = (int) malloc(sizeof(int)*x*y))  

    No es necesario lanzar malloc() . Sí, se requiere verificar si el malloc () fue exitoso o no. Digamos que malloc() falló y está tratando de acceder al puntero. La memoria de pensamiento asignada dará lugar a la falla. Por lo tanto, es mejor detectar la falla de asignación de memoria antes de acceder al puntero.

     int *arr = malloc(sizeof(int)); if(arr == NULL) { printf("Memory allocation failed"); return; } 

    Esto principalmente solo se sum a la respuesta existente, pero entiendo de dónde vienes, si haces mucha asignación de memoria, tu código se ve muy feo con todas las comprobaciones de error para malloc.

    Personalmente, a menudo soluciono esto usando una pequeña envoltura malloc que nunca fallará. A menos que su software sea un sistema resiliente y de seguridad crítica, no se puede solucionar el problema de malloc de todos modos, así que sugeriría algo como esto:

     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; } 

    Lo que al menos garantizará que obtenga un mensaje de error y cierre limpio, y evita la mayor parte del código de comprobación de errores.

    Para una solución más genérica para las funciones que pueden fallar, también tiendo a implementar un macrosco simple como este:

     #define PrintDie(...) \ do \ { \ fprintf(stderr, __VA_ARGS__); \ abort(); \ } while(0) 

    Que luego le permite ejecutar una función como:

     if(-1 == foo()) PrintDie("Oh no"); 

    Lo que le da un trazador de líneas único, una vez más, evitando la mayor parte mientras permite las comprobaciones adecuadas.