¿Debo verificar si malloc() fue exitoso?




error-handling runtime-error (2)

Esto solo se agrega a la respuesta existente, pero entiendo de dónde vienes, si haces mucha asignación de memoria, tu código termina viéndose muy feo con todas las verificaciones de errores de malloc.

Personalmente, a menudo lo soluciono con un pequeño contenedor de malloc que nunca fallará. A menos que su software sea un sistema resistente y crítico para la seguridad, de todos modos no puede evitar significativamente la falla de malloc, por lo 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 asegurará que recibas un mensaje de error y un bloqueo limpio, y evitará la mayor parte del código de verificación de errores.

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

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

Lo que luego le permite ejecutar una función como:

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

Lo que le brinda un forro único, evitando nuevamente el volumen mientras habilita los controles adecuados.

¿Debería verificar después de cada malloc () si fue exitoso? ¿Es posible que falle un malloc ()? ¿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))
    <error>

No es necesario lanzar malloc() . Sí, es necesario verificar si malloc () fue exitoso o no. Digamos que malloc() falló y está intentando acceder al puntero, pensando que la memoria asignada le dará lugar a un bloqueo, por lo que es mejor detectar la falla de asignación de memoria antes de acceder al puntero.

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




allocation