usar como array c memory-management malloc

como - malloc sizeof



La asignación de memoria falla. Pero ¿por qué se estrella? O lo hace? (2)

Como se ha dicho en los comentarios, no hay un fallo en el fallo de asignación, solo un mensaje de error.

Si el mensaje le molesta, puede desactivarlo redirigiendo el registro de malloc a /dev/null , así:

export MallocLogFile=/dev/null

La salida antes de configurar la variable de entorno se ve así:

newstr = prevstr: Same block reused a.out(4275,0x7fff7146e000) malloc: *** mach_vm_map(size=153288611651584) failed (error code=3) *** error: can''t allocate region *** set a breakpoint in malloc_error_break to debug could not alloc newsize=153288611651277. Sorry

Después de configurar la variable, la salida se ve así:

newstr = prevstr: Same block reused could not alloc newsize=153288611651277. Sorry

Nota: Esto es altamente específico de Mac. Consulte la documentation para obtener una descripción de otras variables de entorno que modifican los detalles de la operación de malloc .

Estaba experimentando con realloc , dándole tamaños cada vez más grandes y comprobando si el mismo bloque se reutilizó o no:

int main ( void ) { char * newstr, * prevstr = NULL; size_t newsize, prevsize = 0; printf ("We play with realloc/n"); while (1) { newsize = prevsize + 1 + prevsize/3; /* add 33% */ newstr = realloc(prevstr, newsize); if (newstr == NULL) { printf ("could not alloc newsize=%zu. Sorry/n", newsize); break; } else { printf ("newsize=%zu successfully alloc''ed/n", newsize); if (newstr == prevstr) { printf ("newstr = prevstr:/tSame block reused/n"); } else { printf ("newstr != prevstr:/tNew block alloc''ed/n"); } prevstr = newstr; prevsize = newsize; } } return (EXIT_SUCCESS); }

Como se esperaba, finalmente se llega a un punto en el que el tamaño es demasiado grande y realloc no puede responder a la solicitud. De acuerdo con el manual, realloc debería devolver NULL y establecer errno = ENOMEM cuando no realloc éxito.

Esto no es lo que sucede cuando ejecuto el código anterior en mi máquina, una Mac con "Darwin Kernel Version 15.0.0". En lugar de devolver NULL, el código se bloquea y dice

malloc: *** mach_vm_map(size=153288611651584) failed (error code=3) *** error: can''t allocate region *** set a breakpoint in malloc_error_break to debug could not alloc newsize=153288611651277. Sorry

¿Esto es normal? ¿Algo que no entendí al leer la página de manual?

Esto no es crucial para mi código en este momento, pero puedo imaginar situaciones en las que me gustaría probar si la memoria se puede asignar sin correr el riesgo de un bloqueo. ¿Existe una forma estándar de probar si la asignación funcionará sin correr el riesgo de tal caída?

AGREGADO después de resolver el misterio (ver las respuestas a continuación): no hay bloqueo, solo un mensaje de error del sistema de malloc que se interpone en el camino de la salida esperada. Vea a continuación sobre cómo evitar eso.


El código no se bloqueó porque "no se pudo asignar el tamaño de newsize = 153288611651277. Se produjo el error" Lo sentimos ", solo se imprimió un mensaje adicional. @Blagovest Buyukliev

Es probable que el mensaje adicional se envíe en stderr lugar de en stdout . @Eugene Sh.