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 :

[Debutant]Allocation de mémoire


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 19
    Points : 17
    Points
    17
    Par défaut [Debutant]Allocation de mémoire
    bonjour

    au bout d'un moment d'utilisation, mon programme plante.

    je suppose que celà vient d'un problème d'allocation de mémoire

    voici le principe de mon code :

    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
     
     
    void fonctionX (char ** chaine) {
    // traitement
    // ...
     
    // le but ici est de supprimer le premier caractère de la chaîne
    (*chaine)++;
     
    }
     
    void main (void) {
     
    char * Trame1 = (char*) malloc(10000*sizeof *Trame1);
     
    do {
    // traitement
    // ...
    fonctionX(&Trame1 );
     
    } while (conditionY);
    Je me dit qu'à force de décaller l'adresse de ma chaine, j'arrive dans une zone mémoire non allouée et que mon programme plante à ce moment là.

    est ce possible ?

    est ce que je peux résoudre mon probleme en effectuant un realloc dans "fonctionX" ?

    quelle est la syntaxe exacte pour la réalocation d'une chaine à partir de son pointeur (si je suis pas clair, comment réallouer "chaine" dans ma fonction "fonctionX") ?

    merci pour vos réponses !

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Le mieux aurais été d'avoir un code complet compilable, puis ha oui, main retourne un int donc vire le void et met int a la place pis dans ton cas, pour le malloc, inutile de faire un cast ! C'est sûr, cela ne résoudera pas ton problème !

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    oué enfin ce que tu me dis m'avance pas beaucoup ...

    je vais pas t'envoyer tout le code source de mon appli, ma boite va pas être contente ...

    c'est une appli en VC++, y a pas vraiment de void main void, c'était juste pour essayer d'etre clair.

    le probleme étant situé sur des fonctions C pures, ce forum me parait approprié.

    ma question est simple : est ce que mon programe peut planter à cause de l'allocation de mémoire de la variable chaine/trame1 ?

    je te demande pas si mon code est bien fait...

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par gwendal84
    ma question est simple : est ce que mon programe peut planter à cause de l'allocation de mémoire de la variable chaine/trame1 ?

    je te demande pas si mon code est bien fait...
    Non, ton allocation me parait correcte, du moment que tu vérifie le resultat de retour de malloc mais c'est sûr que si tu essayes d'écrire au delà de la zone mémoire c'est le plantage assuré, je pense même que rien que le fait de vouloi y accéder ferais planter le programme !

    Si tu veut des infos sur realloc: http://emmanuel-delahaye.developpez....es.htm#realloc

  5. #5
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    bon apparement j'ai résolu mon problème en faisant :

    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
     
     
     
    void fonctionX (char ** chaine) {
    // traitement
    // ...
     
    // le but ici est de supprimer le premier caractère de la chaîne
    (*chaine)++;
     
    }
     
    void main (void) {
     
    char * Trame1 = (char*) malloc(10000*sizeof *Trame1);
     
    do {
    // traitement
    // ...
    fonctionX(&Trame1 );
     
     
    // ICI
    Trame1 = (char*) malloc(10000*sizeof *Trame1);
     
     
    } while (conditionY);
    bref merci de m'avoir confirmé que le plantage pouvait venir de là !

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Si tu fais comme ça, un spécialiste de ta boîte ne sera sûrement pas content à moins que tu ne fassent quelque part un freeTtrame1=, car tu as des fuites de mémoire de 10000*sizeof *Trame1) à chaque tour de boucle !!!
    D'autre part:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void fonctionX (char ** chaine) {
    // traitement
    // ...
     
    // le but ici est de supprimer le premier caractère de la chaîne
    (*chaine)++;
     
    }
    ne supprime qu'apparemment le premier caractère il existe toujours et en particulier cette zone mémoire est toujours bloquée par le processus et n'est pas rendue au système si jamais elle avait été allouée par un malloc.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    De plus, tu dois stocker quelque part le pointeur retourné par malloc() et ne pas le modifier: free() n'accepte pas un pointeur au milieu d'un bloc alloué par malloc() : Il faut obligatoirement pointer au début du bloc.

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

Discussions similaires

  1. [debutant] : Allocation de mémoire dynamique
    Par sam.fet dans le forum Langage
    Réponses: 5
    Dernier message: 15/02/2006, 14h58
  2. Problème d'allocation de mémoire dans la pile
    Par prophet666 dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 19/01/2006, 02h22
  3. Double allocation de mémoire
    Par hunter001 dans le forum C++
    Réponses: 16
    Dernier message: 25/08/2005, 13h53
  4. pb d'allocation de mémoire
    Par shura dans le forum C
    Réponses: 7
    Dernier message: 17/04/2005, 21h10
  5. Réponses: 13
    Dernier message: 13/07/2004, 15h41

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