¿Bajo qué circunstancias malloc puede devolver NULL?

8 minutos de lectura

¿Bajo que circunstancias malloc puede devolver NULL
RanZilber

Nunca me ha pasado, y llevo años programando.

¿Puede alguien darme un ejemplo de un programa no trivial en el que malloc en realidad no funcionará?

No estoy hablando de agotamiento de la memoria.: Estoy buscando el caso simple cuando está asignando solo un bloque de memoria en un tamaño límite dado por el usuario, digamos un número entero, causas malloc fallar

  • Buscando la mayor cantidad de respuestas en menos de 2 minutos, premio aquí 🙂

    –Michael Dorgan

    1 de febrero de 2012 a las 19:05

  • @MichaelDorgan: puede ser fácil para usted, pero todas mis aplicaciones no triviales con problemas de malloc se entregaron a los clientes, por lo que no tengo la libertad de publicarlas 🙂

    – Martín James

    1 de febrero de 2012 a las 19:13

  • Si asigna un solo bloque de tamaño limitado, y su límite es lo suficientemente pequeño, su sistema siempre puede proporcionar la memoria, por supuesto, siempre tendrá éxito. Sin embargo, en este caso, su programa de juguetes de asignación única es trivial.

    – Inútil

    1 de febrero de 2012 a las 19:14

  • Lol: trabajé en plataformas portátiles durante tantos años que NULL de malloc es bastante fácil de lograr para mí.

    –Michael Dorgan

    1 de febrero de 2012 a las 19:15

  • @Useless: si pierde memoria con el tiempo, o simplemente la fragmenta como un loco, ningún malloc de ningún tamaño es completamente seguro.

    –Michael Dorgan

    1 de febrero de 2012 a las 19:17

1647299229 439 ¿Bajo que circunstancias malloc puede devolver NULL
paxdiablo

Debe trabajar un poco en los sistemas integrados, con frecuencia obtendrá NULL devuelto allí 🙂

Es mucho más difícil quedarse sin memoria en los sistemas modernos de espacio de direcciones masivas y almacenamiento de respaldo, pero aún es bastante posible en aplicaciones donde procesa grandes cantidades de datos, como GIS o bases de datos en memoria, o en lugares donde su el código con errores da como resultado una pérdida de memoria.

Pero realmente no importa si nunca lo ha experimentado antes: el estándar dice que puede suceder, por lo que debe atenderlo. Tampoco he sido atropellado por un automóvil en las últimas décadas, pero eso no significa que deambule por las carreteras sin mirar primero.

Y re tu edición:

No estoy hablando de agotamiento de la memoria, …

el mismo definición de agotamiento de la memoria es malloc no darle el espacio deseado. Es irrelevante si eso se debe a la asignación de toda la memoria disponible o la fragmentación del montón, lo que significa que no puede obtener un bloque contiguo a pesar de que el total de todos los bloques libres en el campo de la memoria es mayor, o si limita artificialmente el uso del espacio de direcciones, como el uso de la función compatible con los estándares. :

void *malloc (size_t sz) { return NULL; }

El estándar C no distingue entre modos de fracaso, sólo que tiene éxito o fracasa.

  • El cartel preguntó si hay un caso en el que malloc() devuelve 0 y la memoria NO está agotada. El caso de la fragmentación se vuelve mucho más divertido, pero se necesitará un código no trivial (sintonizado con un asignador particular) para mostrar el patrón.

    – Brian Bulkowski

    11 de septiembre de 2014 a las 6:51

  • Brian, creo que eso está cubierto en mi respuesta. El agotamiento de la memoria se define como malloc no poder darte lo que quieres. Ya sea que realmente se haya quedado sin memoria por completo o si solicitó 60 bytes y el asignador tiene mil millones de fragmentos de 30 bytes que no se pueden fusionar, realmente no importa. Es agotamiento en ambos casos. En cualquier caso, un malloc que devuelve NULL cada décima vez que lo llamas sin importar cuánta memoria tenga (escrito por un verdadero sádico) aún cumple con el estándar.

    – pax diablo

    11 de septiembre de 2014 a las 6:56


¿Bajo que circunstancias malloc puede devolver NULL
Inútil

Si.

solo trata de malloc más memoria de la que su sistema puede proporcionar (ya sea agotando su espacio de direcciones o memoria virtual, lo que sea más pequeño).

malloc(SIZE_MAX)

probablemente lo hará. Si no, repite varias veces hasta que se te acabe.

  • Mi primera computadora fue un sistema de 8 bits con 56 KB de RAM. malloc() devuelto NULL todo demasiado a menudo.

    – Ferruccio

    1 de febrero de 2012 a las 19:04

  • gracias eso pero eso es bastante trivial. Estoy hablando del caso simple en el que asignamos solo una parte limitada de la memoria. ¿Todavía puede fallar? ver mi edición

    – RanZilber

    1 de febrero de 2012 a las 19:06

  • Lo siento, claramente debería haber publicado un programa no trivial que asigna cientos de millones de objetos de tamaño sensible por una buena razón, lo que obviamente tendría exactamente el mismo resultado. ¡Sin embargo, es diferente a ser legible, conciso y no trivial!

    – Inútil

    1 de febrero de 2012 a las 19:13


  • Esta respuesta es el caso donde la memoria está agotada. El cartel solicitó un caso en el que malloc() devuelva 0 y la memoria NO esté agotada.

    – Brian Bulkowski

    11 de septiembre de 2014 a las 6:48

  • Eso fue editado en la pregunta después de que se escribió la respuesta. Sin embargo, su máquina virtual se está quedando sin páginas, o alcanzando un límite de compromiso excesivo, o su proceso se está quedando sin direcciones contiguas son diferentes formas de agotamiento: no tengo idea de cuál de ellos se supone que indica “agotamiento de memoria”.

    – Inútil

    11/09/2014 a las 12:33


1647299230 662 ¿Bajo que circunstancias malloc puede devolver NULL
ruso

Cualquier programa escrito en c que necesite asignar dinámicamente más memoria de la que permite actualmente el sistema operativo.

Por diversión, si está utilizando ubuntu, escriba

 ulimit -v 5000

Es muy probable que cualquier programa que ejecute se bloquee (debido a una falla de malloc) ya que ha limitado la cantidad de memoria disponible para cualquier proceso a una cantidad concisa.

A menos que su memoria ya esté completamente reservada (o fuertemente fragmentado), la única manera de tener malloc() devolver un NULL-el puntero es para solicitar espacio de tamaño cero:

char *foo = malloc(0);

Citando del estándar C99, §7.20.3, subsección 1:

Si el tamaño del espacio solicitado es cero, el comportamiento está definido por la implementación: se devuelve un puntero nulo o el comportamiento es como si el tamaño fuera un valor distinto de cero, excepto que el puntero devuelto no se utilizará para acceder a un objeto.

En otras palabras, malloc(0) puede devolver un NULL-puntero o un puntero válido a cero bytes asignados.

1647299230 631 ¿Bajo que circunstancias malloc puede devolver NULL
miguel dorgan

Elija cualquier plataforma, aunque incrustada probablemente sea más fácil. malloc (o new) una tonelada de RAM (o perder RAM con el tiempo o incluso fragmentarla usando algoritmos ingenuos). Auge. malloc regresa NULL para mí en ocasiones cuando suceden cosas “malas”.

En respuesta a su edición. Si de nuevo. La fragmentación de la memoria con el tiempo puede hacer que incluso una sola asignación de un int puede fallar También tenga en cuenta que malloc no solo asigna 4 bytes para un int, pero puede tomar tanto espacio como quiera. Tiene su propio material de contabilidad y, con bastante frecuencia, ocupará un mínimo de 32 a 64 bytes.

  • Me gusta esta respuesta porque habla sobre la fragmentación de la memoria y la contabilidad. Simplemente porque [physical] la memoria está “allí” no significa que siempre esté “disponible”. Eso es un, malloc lata incluso fallan con menos datos asignados que la memoria total. (Me gusta la respuesta complementaria sobre la memoria virtual y el compromiso excesivo también).

    usuario166390

    1 de febrero de 2012 a las 19:22


  • ¿Está seguro? ¿Puedes ver: stackoverflow.com/questions/29613162/…

    – Koray Tugay

    13/04/2015 a las 19:25

1647299230 699 ¿Bajo que circunstancias malloc puede devolver NULL
Lame caliente

En un sistema más o menos estándar, usando un malloc estándar de un parámetro, hay tres posibles modos de falla (en los que puedo pensar):

1) No se permite el tamaño de la asignación solicitada. Por ejemplo, es posible que algunos sistemas no permitan una asignación > 16 M, incluso si hay más almacenamiento disponible.

2) No se puede ubicar en el montón un área libre contigua del tamaño solicitado, con límite predeterminado. Todavía puede haber mucho montón, pero no lo suficiente en una sola pieza.

3) El montón total asignado ha excedido algún límite “artificial”. Por ejemplo, se le puede prohibir al usuario que asigne más de 100M, incluso si hay 200M libres y disponibles para el “sistema” en un solo montón combinado.

(Por supuesto, puede obtener combinaciones de 2 y 3, ya que algunos sistemas asignan bloques de espacio de direcciones no contiguos al montón a medida que crece, colocando el “límite de tamaño del montón” en el total de los bloques).

Tenga en cuenta que algunos entornos admiten parámetros malloc adicionales, como la alineación y el ID del grupo, que pueden agregar sus propios giros.

  • Me gusta esta respuesta porque habla sobre la fragmentación de la memoria y la contabilidad. Simplemente porque [physical] la memoria está “allí” no significa que siempre esté “disponible”. Eso es un, malloc lata incluso fallan con menos datos asignados que la memoria total. (Me gusta la respuesta complementaria sobre la memoria virtual y el compromiso excesivo también).

    usuario166390

    1 de febrero de 2012 a las 19:22


  • ¿Está seguro? ¿Puedes ver: stackoverflow.com/questions/29613162/…

    – Koray Tugay

    13/04/2015 a las 19:25

1647299230 858 ¿Bajo que circunstancias malloc puede devolver NULL
bo persona

Simplemente revise la página del manual de malloc.

En caso de éxito, un puntero al bloque de memoria asignado por la función.
El tipo de este puntero siempre es void*, que se puede convertir en el tipo deseado de puntero de datos para que no se pueda hacer referencia.
Si la función no pudo asignar el bloque de memoria solicitado, se devuelve un puntero nulo.

  • Esto describe el contrato pero, cuando puede/sucede? (“…nunca me pasó… programa no trivial en el que malloc en realidad no funcionará?… cuando está asignando solo un bloque de memoria en un tamaño límite dado por el usuario… ¿sigue siendo posible ¿Ese malloc fallará?”)

    usuario166390

    1 de febrero de 2012 a las 19:13


  • Esto ni siquiera es una respuesta.

    – Koray Tugay

    13 de abril de 2015 a las 19:27

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad