IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

calloc() ou malloc() ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Par défaut calloc() ou malloc() ?
    Bonjour,

    Alors voilà je suis débutant en C et je conçoit en ce moment un programme qui, sans rentrer dans les détails, a besoin d'être très très optimisé au niveau de la gestion mémoire.

    De ce que j'ai appris sur internet, la différence entre calloc() et malloc() vient du fait que calloc() initialise la zone reservé à 0 alors que malloc() se contente juste de réserver la zone.

    Cependant j'ai aussi entendu dire que avec calloc() il y avait un truc sur l'allocation des blocs de la zone reservé, comme quoi c'était moins économe en mémoire dans certaines implémentations que malloc().

    J'ai cherché plus d'infos sur internet mais je sais pas trop a quoi m'en tenir.

    Je suis preneur de toute explication

    Merci d'avance de vos réponses.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    A part le fait que calloc initialise tout à 0 et donc qu'il est moins rapide que malloc, je ne pense pas qu'il y ai réellement de différences.

    malloc est très utile lorsqu'on est sûr de remplir la zone avant de la lire.
    calloc est plutôt utilisé pour tout initialisé à 0 lorsqu'on est pas sûr de remplir cette zone avant de la lire, cela évite donc des segfault avec les pointeurs.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cela évite donc des segfault
    Cela n'évite pas plutôt de lire n'importe quoi ? La zone nous étant allouée, on peut y lire sans risque.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <stdlib.h>
    #include <stdio.h>
     
    int main(void) {
     
    	char *pt_test = malloc(sizeof(char)*100);
    	int i=0;
     
    	for(i=0;i<100;i++)
    	{
    		printf("(%d)%c", i, *(pt_test+i));
    	}
     
    	return 0;
    }

    EDIT : j'ai trouvé ce lien intéressant. Celui-ci l'est également.

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Si tu fait un malloc pour une structure contenant des pointeurs, et que tu utilises directement ces pointeurs, tu vas avoir un segfault sans savoir d'où il vient car tu vas écrire sur un espace qui ne t'appartient pas.

    Alors que si tu fais un calloc, les pointeurs seront tous NULL.

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Si tu fait un malloc pour une structure contenant des pointeurs, et que tu utilises directement ces pointeurs
    Si tu fais des conneries, c'est normal d'avoir n'importe quoi comme resultat....

    Si tu as besoin d'une zone memoire, et que immediatement apres tu remplis celle-ci entierement avec des valeurs (correctes s'entend), alors le fait d'initialiser a 0 entre les deux ne sert a rien.

    En revanche, si tu alloues un espace memoire, puis qu'un programme externe doit l'utiliser, tu dois te proteger de toutes les conneries que pourrait faire ce programme, et donc tu dois initialiser la zone memoire a 0, afin que le programme appelant puisse faire toutes les betises qu'il souhaite.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Si tu fait un malloc pour une structure contenant des pointeurs, et que tu utilises directement ces pointeurs, tu vas avoir un segfault
    Normal. Tu n'accèdes dans ce cas pas à la zone que tu viens d'allouer, mais à une autre zone. Je ne pensais pas à ce genre d'utilisation dans mon exemple, qui se bornait à lire la zone allouée.


    Citation Envoyé par Neckara Voir le message
    Alors que si tu fais un calloc, les pointeurs seront tous NULL.
    Visiblement, ce n'est pas certain d'après mon premier lien. dont voici un extrait :

    calloc's zero fill is all-bits-zero, and is therefore guaranteed to yield the value 0 for all integral types (including '\0' for character types). But it does not guarantee useful null pointer values (see section 5 of this list) or floating-point zero values.

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Je ne savais pas que NULL n'était pas toujours égal à 0.

    Calloc permettra tout de même de vite retrouver l'erreur.
    On verra que le pointeur vaut 0 donc on fera vite le lien.

    Pour un programme externe, il faudra qu'il vérifie si le pointeur ne vaux pas '0' (et/ou NULL dans certains cas).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Embrouille avec les malloc / calloc / realloc
    Par titimoi dans le forum Débuter
    Réponses: 16
    Dernier message: 12/03/2009, 16h53
  2. malloc calloc realloc free
    Par lia20 dans le forum C
    Réponses: 7
    Dernier message: 26/05/2007, 15h22
  3. Pb : malloc qui marche une fois sur deux .... ?
    Par guillaume_pfr dans le forum C
    Réponses: 14
    Dernier message: 21/07/2003, 09h52
  4. Erreur de sgmentation avec malloc
    Par simonm dans le forum C
    Réponses: 5
    Dernier message: 27/02/2003, 08h29
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo