Question

Étant donné ce code C compilé avec 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;

}

Je m'attendrais à ce que la sortie corresponde à ce qui était dans la mémoire renvoyée par malloc (), mais à la place, la sortie est 0. Malloc met-il à zéro la mémoire qu'il restitue? Si oui, pourquoi?

Était-ce utile?

La solution

malloc lui-même ne met pas à zéro la mémoire, mais de nombreux systèmes d'exploitation remettront à zéro la mémoire demandée par votre programme pour des raisons de sécurité (pour empêcher un processus d'accéder à des informations potentiellement sensibles utilisées par un autre processus ).

Autres conseils

La fonction malloc () ne définit aucune valeur spécifique de la mémoire allouée. Si vous voulez vous assurer que la mémoire est à zéro, utilisez calloc () ou son équivalent. Sinon, vous obtenez ce que vous aviez avant (ce qui pourrait, dans votre cas, être nul).

La valeur dans la mémoire allouée est officiellement indéfinie. C99 déclare: La fonction malloc alloue de la place pour un objet dont la taille est spécifiée par une taille et dont la valeur est indéterminée. malloc () peut faire tout ce qu'il veut, y compris en le mettant à zéro. Cela peut être délibéré, un effet secondaire de la mise en œuvre, ou vous pouvez simplement avoir beaucoup de mémoire qui se trouve être 0.

FWIW sous OS X avec le gcc 4.0.1 d’Apple Je ne peux pas le faire sortir sans même faire beaucoup d’allocations:

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

Malloc n'a pas besoin de remplir sa mémoire. Pour des raisons de performances, les versions ne font souvent rien avec de la mémoire. Un " sécurisé " La bibliothèque peut avoir une implémentation malloc qui efface la mémoire. C'est à l'implémenteur de la bibliothèque de décider. Il existe des modèles courants qui sont mis en mémoire par les bibliothèques de débogage du compilateur et qui sont a-t-il été expliqué dans cette rubrique de stackoverflow .

Vous ne pouvez absolument pas compter sur 0. malloc un plus gros morceau et le vider pour voir.

Si c'est int; int = 0; ou int = 00000000; sa va prendre le même espace en mémoire. le printf attrape souvent le premier 0 comme un terminateur nul indépendamment de ce qu'il y a d'autre dans la chaîne. Si vous utilisez des comparateurs de chaînes et que 0 est un paramètre fictif, je vous recommande d'utiliser TOUT, mais 0 pour ce paramètre fictif, car les bibliothèques basées sur des chaînes sont vraiment nul. Essayez F puis écrivez le contrôle en insérant le terme nul ou le saut de ligne comme il se doit, il sera beaucoup plus portable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top