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 :

probleme d'allocation dynamique de mémoire


Sujet :

C

  1. #1
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut probleme d'allocation dynamique de mémoire
    Bonsoir tous,

    Je fais (sous linux) une fonction qui permet de rechercher une chaine de caractère passé en paramètre dans un fichier texte.

    Voici cette fonction:

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
     
    char *date_search;
    char *date_search=malloc(sizeof(char));
    ...
     
       date_search="Mar 11 07:31:18";
       Ulog_Search(date_search);
       date_search="Mar 12 09:56:18";
       DatePosition = Ulog_Search(date_search);
    ...
     
    int Ulog_Search(char *stringSearch)
    {
     
     int position, lenght_str, c, j;
     char v, *res;
     
     position=ftell(file_ulog);
     
     printf("Position: %d\n", position);
     
     res=malloc(sizeof(char));
     
     //On recupere la longueur de la chaine
     lenght_str=strlen(stringSearch);
     
     printf("Chaine rechercher: %s, longeur: %d\n", stringSearch, lenght_str);
     
     while(( c=fgetc(file_ulog)) != EOF && strcmp(res, stringSearch) != 0)
     {
     
       fseek(file_ulog, -1, SEEK_CUR);
     
       for(j=0; j<lenght_str; j++)
       {
         fscanf(file_ulog,"%c",&v);
     
         if(stringSearch[j] == v)
         {
           res[j]=v; 
         }
     
       }
     }
     
     printf("\nres: %s", res);
     printf("\nStringSearch: %s\n", stringSearch); 
     
     printf("Position dans le fichier: %d\n", ftell(file_ulog));
     
     free(res);
     res=NULL;
     
     return ftell(file_ulog);
     
    }
    Passons les printf et le return qui servent juste de test, tous cela doit être supprimé une fois terminé.

    Mon problème vient du res=malloc(sizeof(char)); et du free(res) a la fin de cette fonction.

    Lors du premier appelle a la fonction tous se passe bien
    Mais à la seconde ca plante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Chaine rechercher: Mar 11 07:31:18, longeur: 15
     
    res: Mar 11 07:31:18
    StringSearch: Mar 11 07:31:18
    Position dans le fichier: 16
    *** glibc detected *** free(): invalid next size (fast): 0x0804b650 ***
    Je suppose que c'est le free qui ne va pas, la désallocation ou la réallocation mémoire doit merdouiller. J'avoue avoir un peu du mal avec ces fonctions.

    Pouvez-vous m'aider?

    merci :-)

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    euhhh je ne sais pas exactement ce que tu veux faire, mais là je suis quasi sûr que ça le fait pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char *date_search;
    char *date_search=malloc(sizeof(char));
    C'est l'un ou l'autre....

    D'autre part l'inconvénient d'initialiser comme ça est que de toutes façons il faut tester après si l'allocation a échoué ou réussi.

    De plus, tu n'alloues que pour 1 caractère....

    Donc je ferais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char *date_search = NULL ;
     
    date_search = malloc ( 20 );
    if ( date_search == NULL )
     {  
        fprintf ( stderr, "ERREUR D'ALLOCATION !!");
        return 1 ;
     }
    ...

    Ensuite après avoir fait ça (ton premier code), tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       date_search="Mar 11 07:31:18";
    Là, non seulement tu n'avais pas alloué la place (puisque tu avais alloué pour 1), mais de plus tu ne copies pas la chaîne.

    Si tu veux remplir date_search avec la chaîne à droite, tu dois faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strcpy ( date_search, "Mar 11 07:31:18");
    L'affectation d'une chaîne ne se fait pas par le signe = .

    Ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     position=ftell(file_ulog);
    D'où il vient, ce file_ulog ? Pourquoi ne pas le passer en paramètre ?

    Toujours intialiser les pointeurs à NULL (ou malloc) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     char v, *res=NULL;

    Esnuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     res=malloc(sizeof(char));
    Il faut tester le retour....


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     while(( c=fgetc(file_ulog)) != EOF && strcmp(res, stringSearch) != 0)
    Tu n'as rien mis dans res ... Comment veux-tu qu'une comparaison fonctionne ??

    Ensuite encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       Ulog_Search(date_search);
    ça n'est pas un void, il lui faut donc, comme le suivant, un entier pour stocker le retour.....

    Passons les printf et le return qui servent juste de test, tous cela doit être supprimé une fois terminé
    t'as bien raison.. Vu le reste ...

    Et je ne dirais rien de l'algo en tant que tel.. Corrige déjà, on verra après....

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Blo0d4x3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    char *date_search;
    char *date_search=malloc(sizeof(char));
     
       date_search="Mar 11 07:31:18";
    STOP ! Il faut cesser de coder au hasard. Si tu ne connais pas le C, il faut l'apprendre. Le langage C n'est pas un de ces langages jouets avec lequel on peut faire n'importe quoi sans se blesser. C'est un langage professionnel qui demande art et maitrise.

    Je te conseille de suivre un des tutoriels de ce site ou du mien.

Discussions similaires

  1. probleme allocation dynamique de mémoire
    Par totoscill dans le forum C
    Réponses: 18
    Dernier message: 28/02/2008, 16h44
  2. Allocation dynamique de mémoire
    Par cd090580 dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 12/11/2005, 11h17
  3. [VC++/ASM] Allocation dynamique de mémoire ?
    Par Magus (Dave) dans le forum x86 32-bits / 64-bits
    Réponses: 7
    Dernier message: 21/12/2004, 15h05
  4. probleme d'allocation dynamique
    Par vince3320 dans le forum C
    Réponses: 10
    Dernier message: 22/04/2004, 16h27
  5. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31

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