
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

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.

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.

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.

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.

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.

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.
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