2009-10-25 22 views
14

Teniendo en cuenta este código C compilado con gcc 4.3.3malloc puesta a cero de la memoria?

#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; 

} 

que sería de esperar que la salida sea lo que hubiera en la memoria que malloc() devuelve, sino que la salida es 0. Es malloc poniendo a cero la memoria ¿vuelve? Si es así, ¿por qué?

+3

¿Esta depuración o versión? – ChrisF

+0

Lo que espera es el caso. Emite lo que estaba en la memoria que devuelve malloc(), que resultó ser cero. –

Respuesta

30

malloc 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 otro proceso utilizó).

+0

¡Gracias, esto me da un lugar donde buscar la respuesta específica! – endeavormac

+6

Debo mencionar que nada en el estándar * impide * que malloc ponga a cero su memoria. Para la eficiencia, * por lo general * no lo hace, pero esto no es obligatorio. – paxdiablo

+15

También tenga en cuenta que si bien la memoria nueva del sistema operativo puede ponerse a cero, si su aplicación recicla la memoria que estaba utilizando anteriormente, es probable que _no_ se ponga a cero. Así que ni siquiera pienses en confiar en esto :) – bdonlan

7

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

+0

Me esperaba eso, si no fuera consistente 0. ¿Por qué obtendría un valor que consistentemente es 0, una y otra vez? – endeavormac

+2

¿Está ejecutando el mismo programa de la misma manera repetidamente y esperando resultados diferentes? Aunque 'malloc()' en sí mismo no garantiza que se ponga a cero la memoria, el sistema operativo está haciendo el mismo trabajo para cargar su programa y configurarlo en ejecución. El código de la biblioteca en tiempo de ejecución hace lo mismo para configurar la memoria del montón y comenzar a ejecutar el código. Como se menciona en otra respuesta, es probable que el sistema operativo le proporcione nuevas páginas de memoria inicializadas a un valor específico, con el fin de aislar diferentes procesos entre sí. –

+0

Su programa está solicitando memoria nueva del sistema operativo. El sistema operativo tendrá memoria cero cuando se asigna por primera vez a un proceso. Intente completar los valores aleatorios, libere() la pieza y asigne otra. – nos

1

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

1

El valor en la memoria asignada no está definido oficialmente. C99 dice: The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate. malloc() puede hacer lo que quiera, incluso ponerlo a cero. Esto puede ser deliberado, un efecto secundario de la implementación, o puede tener mucha memoria que es 0 0.

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

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

Intenta configurar * i en un valor distinto de cero, liberándote, luego malloccionando de nuevo y observa lo que obtienes. –

+0

Cualquier memoria que esté asignada a su proceso por primera vez se establecerá en cero por razones de seguridad, de modo que no pueda malloc la memoria y descubra qué información le escribió otro proceso. – gnasher729

+0

@ gnasher729 Esto puede ser lo que hace un compilador de C particular, pero * no hay garantía * este es el caso y no se debe confiar en él. – Schwern

2

Malloc no tiene que llenar la memoria. Por motivos de rendimiento, las versiones de lanzamiento a menudo no hacen nada con la memoria. Una biblioteca "segura" 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 por las bibliotecas de depuración de varios compiladores que son explained in this stackoverflow topic.

Cuestiones relacionadas