Pregunta

Dado este código C compilado con gcc 4.3.3

#include <stdio.h>
#include <stdlib.h>


int main(int argc, char * argv[])
{

    int * i;

    i = (int *) malloc(sizeof(int));

    printf("%d\n", *i);
    return 0;

}

Esperaría que la salida sea lo que haya en la memoria que devuelve malloc (), pero en cambio la salida es 0. ¿Malloc está poniendo a cero la memoria que devuelve? Si es así, ¿por qué?

¿Fue útil?

Solución

malloc en sí mismo no pone a cero la memoria, pero muchos sistemas operativos pondrán a cero la memoria que su programa solicita por razones de seguridad (para evitar que un proceso acceda a información potencialmente confidencial que fue utilizada por otro proceso) )

Otros consejos

La función malloc () no establece la memoria asignada a ningún valor específico. Si desea asegurarse de que la memoria sea cero, use calloc () o equivalente. De lo contrario, obtienes lo que había antes (que en tu caso podría ser cero).

El valor en la memoria asignada está oficialmente indefinido. Estados C99: La función malloc asigna espacio para un objeto cuyo tamaño se especifica por tamaño y cuyo valor es indeterminado. malloc () puede hacer lo que quiera, incluso ponerlo a cero. Esto puede ser deliberado, un efecto secundario de la implementación, o puede que tenga mucha memoria que resulta ser 0.

FWIW en OS X con gcc 4.0.1 de Apple No puedo hacer que salga ni 0 incluso haciendo muchas asignaciones:

for( idx = 0; idx < 100000; idx++ ) {
    i = (int *) malloc(sizeof(int));
    printf("%d\n", *i);
}

Malloc no tiene que llenar memoria. Por razones de rendimiento, las versiones de lanzamiento a menudo no hacen nada con la memoria. A "seguro" La biblioteca puede tener una implementación malloc que borra la memoria. Depende del implementador de la biblioteca. Hay algunos patrones comunes que se llenan en la memoria de varias bibliotecas de depuración del compilador que son explicado en este tema de stackoverflow .

Definitivamente no puedes depender de que sea 0. malloc un trozo más grande y volcarlo para ver.

Si es int; int = 0; o int = 00000000; ocupará el mismo espacio en la memoria. El printf a menudo capturará el primer 0 como un terminador nulo, independientemente de qué más hay en la cadena. Si está utilizando comparadores de cadenas y 0 es un marcador de posición, le recomendaría que use CUALQUIER COSA, pero 0 para ese marcador de posición, ya que las bibliotecas basadas en cadenas realmente apestan. Pruebe F y luego escriba el control en usted mismo insertando un término nulo o una nueva línea, según sea necesario, será mucho más portátil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top