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 :

fonctionnement de malloc


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 83
    Par défaut fonctionnement de malloc
    Bonsoir,

    Après lecture faite je crois comprendre que malloc permet d'allouer de l'espace mémoire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char * mot= malloc(20 * sizeof(char)); //Allocation de 20 octets
    scanf("%s", mot);
    Dans l'exemple ci-dessus, je vais donc réserver 20 octets pour mot.

    Deux questions me viennent en tête:
    1. Est-il possible d'allouer le strict minimum d'octets en fonction de la taille de ma chaîne de caractères ?

    2. Pourquoi ceci ne fonctionne pas ?
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      char * mot;
      scanf("%s", mot);
      Je pensais qu'ignorer le malloc était simplement dangereux au risque d'écraser par erreur des octets occupés...


    Je vous remercie pour votre aide!

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    1) Oui !
    Il faut juste ajouter +1 pour pouvoir stocker le caractère de fin de chaîne "en général" pour éviter des segfaults dans les fonctions qui s'en servent.
    La plupart des fonctions déterminent la fin d'une chaîne par le caractère '\0', mais certaines peuvent travailler sur une taille max (mais faire très très attention avec si tu ne sais pas ce que tu fais).

    Pour connaitre la taille d'une chaîne "déjà" traitée : strlen
    Sinon, tu dois garder la taille que tu lis d'un fread/read/... et copier la chaine vers un espace alloué plus grand contenant un '\0' à la fin.
    copie avec memcpy ou strncpy (le N est important car c'est ce qui différencie les fonctions travaillant avec une taille, de celles avec le '\0')

    2) scanf n'alloue pas de taille, il place dans un espace déjà alloué il me semble.
    Si tu es sûr de lire un entier, tu peux déclarer un int, et mettre sa référence.
    Pour une chaîne, il faudra d'abord l'allouer, ou la placer dans un buffer (char *buf[512]; OU char *str; str = malloc(512 * sizeof (char));
    Dans ton cas, avec scanf, tu dois déjà connaitre la taille de ce qui rentrera, c'est donc un mauvais choix si tu ne connais pas d'avance les valeurs qui seront lues (et tu devrais utiliser fread dans ce cas).
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    La bibliothèque standard du C n'a pas de fonction toute faite pour saisir au clavier une chaîne de caractères de longueur non-bornée. C'est une chose que tu dois faire toi-même:
    • en lisant l'entrée, par exemple (mais pas obligatoirement) caractère par caractère
    • en remplissant un buffer au fur et à mesure
    • Et en allouant de la mémoire supplémentaire à chaque fois que le buffer est plein.
      • soit avec realloc(), le plus souvent avec une croissance géométrique
      • soit en allouant de nouveaux buffers avec une liste chaînée, et en concaténant tout à la fin
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 83
    Par défaut
    Super merci pour vos explications !

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

Discussions similaires

  1. Réponses: 21
    Dernier message: 01/09/2011, 09h56
  2. fonctionnement du malloc
    Par pfeuh dans le forum C
    Réponses: 3
    Dernier message: 19/12/2008, 14h35
  3. Réponses: 6
    Dernier message: 12/04/2007, 13h58
  4. [Turbo Pascal] TP7 fonctionne en QWERTY
    Par callahan dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 08/02/2003, 21h49
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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