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 :

Libération de l'espace dynamique alloué


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut Libération de l'espace dynamique alloué
    Bonsoir,
    J'ai un fichier contient deux champs: objet et attribut nommé "exemple.txt" :

    2 11
    4 11
    10 10
    5 O1
    .....
    .....

    Sachant que on a la même taille pour tous les attributs de tous les objets dans notre exemple on a la taille = 2.
    Cette taille peut changer d'un exemple à l'autre donc on ne connait pas la taille d'attribut en avance.

    Je voudrais calculer la taille de l'attribut puis vérifier si on dans ce fichier si on a au moins un objet qui possède un attribut tout à 1 c'est à dire la chaine "11" dans notre cas.
    la fonction verifier() nous retourne 1 si il existe la chaine "11" sinon O.

    Voici mon essai :


    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int verifier(int taille)
    {
    FILE *fp;
    char *chaine,s[100],attribut[32];
    int i,trouve=0,objet=0;
    chaine = (char *) malloc(taille);
    for(i=0; i < taille; i++)
    chaine[i]='1';
    chaine[taille]='\0';
    printf("chaine=%s\n",chaine);
    pFTrie = fopen("exemple.txt","r");
    while (fgets(s, 100, fp))
    {
    sscanf(s,"%d%s",objet,attribut);
    if(memcmp(attribut,chaine,taille))
    {
    free(chaine);
    fclose(fp);
    return 1;
    }
    }
    free(chaine);
    fclose(fp);
    return 0;
    }
     
    int main()
    {
    FILE *fp;
    int trouve=0,taille;
    fp=fopen("exemple.txt");
    While (fgets(s,100,fp))
    sscanf(s,"%d%s",&objet,attribut);
    taille=strlen(attribut);
    trouve = verifier(taille);
    printf("valeur de retour %d\n",trouve);
     
    return 0;
    }

    Mais, le message suivant n'affiche pas:
    printf("valeur de retour %d\n",trouve);

    -Pourquoi ?

    lorsque je lance l'exécution après la compilation j'ai le message suivant:
    HEAP CORRUPTION DETECTED : after normal (#95) at 0*01020068.
    CRT detected that the application wrote to memory after end of heap buffer.



    Ceci à cause d 'instruction free chaine(); dans la fonction verifier () car je supprime cette instruction donc l'exection se passe.
    Mais, comment on va liberer l'espace dynamique louée par chaine[taille] ?
    - l'allocation et la libération de l'espace dynamique char *chaine est bien définie ?
    - Existe-t-il le type boolean comme un type des données ? comment le déclare ?
    - On peut utiliser le type boolean comme valeur de retour pour la fonction verifier() ?

  2. #2
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    chaine[taille]='\0';
    Ici tu écrit en dehors de ton tableau !
    le dernier élément du tableau à pour indice taille-1

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut
    Bonjour,

    Voici le programme :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int verifier(int taille)
    {
    FILE *fp;
    char *chaine,s[100],attribut[32];
    int i,trouve=0,objet=0;
    chaine = (char *) malloc(taille);
    for(i=0; i < taille; i++)
    chaine[i]='1';
    chaine[taille]='\0';
    printf("chaine=%s\n",chaine);
    fp = fopen("exemple.txt","r");
    while (fgets(s, 100, fp))
    {
    sscanf(s,"%d%s",objet,attribut);
    if(memcmp(attribut,chaine,taille))
    {
    free(chaine);
    fclose(fp);
    return 1;
    }
    }
    free(chaine);
    fclose(fp);
    return 0;
    }
     
    int main()
    {
    FILE *fp;
    char s[100],attribut[32];
    int trouve=0,taille,objet;
    fp=fopen("exemple.txt","r");
    while (fgets(s,100,fp)!= NULL)
    sscanf(s,"%d%s",&objet,attribut);
    taille=strlen(attribut);
    trouve = verifier(taille);
    printf("valeur de retour %d\n",trouve);
     
    return 0;
    }
    Non. on a taille= 2
    Chaine[0]='1' et Chaine[1]='1'
    et il faut ajouter '\0' à la fin de la chaine donc Chaine[taille]='\0'
    Que pensez-vous ?

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    taille=strlen(attribut);
    trouve = verifier(taille);
    La fonction strlen() calcule la longueur de la chaîne de caractères s, sans compter le caractère nul `\0' final.
    Dans la fonction "verifier" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine = (char *) malloc(taille+1);

  5. #5
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Non. on a taille= 2
    Chaine[0]='1' et Chaine[1]='1'
    et il faut ajouter '\0' à la fin de la chaine donc Chaine[taille]='\0'
    Que pensez-vous ?
    ça fait 3 caractères à écrire les deux '1' et le '\0'
    il te faut donc un tableau de taille 3
    Les indices des tableaux vont toujours de 0 à Taille-1

  6. #6
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut
    Merci. Ca marche.
    taille +1 ou lieu de taille.

    Une seule question:
    - quelle est la différence entre :
    chaine = (char *) malloc((taille+1));
    chaine = (char *) malloc((taille+1)*sizeof(char));

    Les deux marchent.

Discussions similaires

  1. 1Mo d'espace non alloué en début de DD : pourquoi?
    Par honeydew dans le forum Windows Vista
    Réponses: 1
    Dernier message: 29/08/2008, 23h39
  2. libération de toute la mémoire allouée
    Par salseropom dans le forum C
    Réponses: 17
    Dernier message: 05/11/2007, 16h36
  3. Libération mémoire d'objet dynamique
    Par Romvaillant dans le forum C++
    Réponses: 17
    Dernier message: 13/10/2007, 22h46
  4. Réponses: 8
    Dernier message: 14/12/2006, 23h37
  5. Espace disque alloué pour les entiers
    Par stos dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 30/10/2006, 14h17

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