Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1730 connectés 

  FORUM HardWare.fr
  Programmation
  C

  "Segmentation Fault" avec malloc entre 757 et 1973.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

"Segmentation Fault" avec malloc entre 757 et 1973.

n°1238189
thoduv
Posté le 03-11-2005 à 21:11:49  profilanswer
 

Bonjour,
Je recontre en ce moment une erreur très étrange : tous les malloc() que je fais pour une taille comprise entre 757 et 1973 font planter mon programme en renvoyant une "Segmentation fault" ... Si j'essaie avec 1 ou 65536 ca marche, mais entre 757 et 1973, non. En plus ces nombres ne correspondent à rien que je connaisse ...
 
 :??:  
 
Merci d'avance !

mood
Publicité
Posté le 03-11-2005 à 21:11:49  profilanswer
 

n°1238203
Elmoricq
Modérateur
Posté le 03-11-2005 à 21:18:30  profilanswer
 

Comportement aléatoire = tu as un problème de gestion de la mémoire dans ton programme. Qui dépasse le cadre de ton seul malloc().

n°1238233
thoduv
Posté le 03-11-2005 à 21:41:37  profilanswer
 

Arg, juste ce que je redoutais ... Bon bah je vais tout revoir alors ...  :cry:  
 
Sinon tu peux me donner des examples de "problèmes habituels" de gestion de mémoire ?

n°1238238
Elmoricq
Modérateur
Posté le 03-11-2005 à 21:49:03  profilanswer
 

thoduv a écrit :

Sinon tu peux me donner des examples de "problèmes habituels" de gestion de mémoire ?


 
 
T'as le très classique débordement de capacité :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <strings.h>
  4. int main (void)
  5. {
  6.    char source[] = "machin";
  7.    char *cible = malloc(strlen(source) * sizeof *cible);
  8.    if ( cible )
  9.    {
  10.       strcpy(cible, source);
  11.       printf("cible = %s\n", cible);
  12.       free(cible);
  13.    }
  14.    return 0;
  15. }


 
Ca semble fonctionner, sauf qu'aléatoirement tu auras des surprises à l'affichage de "cible".  
Et avec un programme plus étoffé avec ce genre d'erreur, tu te retrouves avec des comportements étranges et aléatoires.
 
Mais des exemples de problèmes mémoires, il y en a des tas d'autres.


Message édité par Elmoricq le 03-11-2005 à 21:49:18
n°1239077
thoduv
Posté le 04-11-2005 à 20:36:28  profilanswer
 

Apparement mon problème vient de cette fontion, qui splitte une chaine :
 

Code :
  1. char** explodestring( char* str, const char* separator )
  2. {
  3. int i = 0;
  4. size_t sizeSeparator = strlen( separator );
  5. int explodedArraySize = 1;
  6. char **explodedArray;
  7. char *pos;
  8. char *explodedStr;
  9. explodedStr = malloc(strlen(str)+2);
  10. strcpy(explodedStr, str);
  11. pos = explodedStr;
  12. while(pos=strstr(pos, separator))
  13. {
  14.  explodedArraySize++;
  15.  pos+=sizeSeparator;
  16. }
  17. explodedArray = malloc((explodedArraySize + 1)* sizeof(char*));
  18. pos = explodedStr;
  19. explodedArray[0] = pos;
  20. while(pos=strstr(pos, separator))
  21. {
  22.  *pos = '\0';
  23.  pos+= sizeSeparator;
  24.  explodedArray[++i] = pos;
  25. }
  26. return explodedArray;
  27. }


 
Je vois pas ce qui colle pas ...

n°1239092
Elmoricq
Modérateur
Posté le 04-11-2005 à 20:46:40  profilanswer
 

Hmm. Tu retournes un char**, mais comment une fonction qui le lira saura où s'arrêter dans son parcours ?
Tu ne retournes pas la taille de ton char**, et tu ne le termines pas par NULL non plus.

n°1239279
Emmanuel D​elahaye
C is a sharp tool
Posté le 05-11-2005 à 12:17:43  profilanswer
 

thoduv a écrit :

Apparement mon problème vient de cette fontion, qui splitte une chaine :
<...>Je vois pas ce qui colle pas ...


Je ne sais pas trop ce que fait

 explodedArray[++i] = pos;


mais si tu veux

            i++;
            explodedArray[i] = pos;


ecrit le comme ça, c'est plus clair pour tout le monde.
 
malloc() ne fait pas d'initialisation. Il manque un  

      i++;
      explodedArray[i] = NULL;


après la dernière boucle.
 
En fait, je l'aurais ecrite comme ça :  

  {
      int i = 0;
      while(pos=strstr(pos, separator))
      {
         *pos = '\0';
         pos +=  sizeSeparator;
         explodedArray[i] = pos;
         i++;  
      }
      explodedArray[i] = NULL;
   }


Message édité par Emmanuel Delahaye le 05-11-2005 à 12:20:18

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1239292
thoduv
Posté le 05-11-2005 à 13:43:05  profilanswer
 

Voilà la fonction corrigée, mais ce ne marche toujours pas, l'erreur est peut-être ailleurs. Mais est-ce qu'il y a encore des erreurs sur cette fonction :
 

Code :
  1. int explodestring(char ***out, char* str, const char* separator )
  2. {
  3. int i = 0;
  4. size_t sizeSeparator = strlen( separator );
  5. int explodedArraySize = 1;
  6. char **explodedArray;
  7. char *pos;
  8. char *explodedStr;
  9. explodedStr = malloc(strlen(str)+2);
  10. strcpy(explodedStr, str);
  11. pos = explodedStr;
  12. while(pos=strstr(pos, separator))
  13. {
  14.  explodedArraySize++;
  15.  pos+=sizeSeparator;
  16. }
  17. explodedArray = malloc((explodedArraySize + 2) * sizeof(char*));
  18. pos = explodedStr;
  19. explodedArray[i] = pos;
  20. i++;
  21. while(pos=strstr(pos, separator))
  22. {
  23.  *pos = '\0';
  24.  pos+= sizeSeparator;
  25.  explodedArray[i] = pos;
  26.  i++;
  27. }
  28. explodedArray[i] = NULL;
  29. *out = explodedArray;
  30. return i;
  31. }

n°1239294
thoduv
Posté le 05-11-2005 à 13:58:36  profilanswer
 

Finalement c'est bon, j'avais oublié d'initialiser un pointeur que je pensais être défini par un fonction, mais laquelle fonction verifiait son contenu (qui était érronné par les malloc/free precedents). Merci quand même ! :D

n°1239297
chrisbk
-
Posté le 05-11-2005 à 14:05:21  profilanswer
 

(j'aime pas le fait que ta fonction modifie son entrée [:rogr])

mood
Publicité
Posté le 05-11-2005 à 14:05:21  profilanswer
 

n°1239365
el muchach​o
Comfortably Numb
Posté le 05-11-2005 à 16:31:04  profilanswer
 

(sans oublier que la fonction standard strtok avec une boucle fait à peu près la même chose)


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1239926
thoduv
Posté le 06-11-2005 à 20:27:15  profilanswer
 

chrisbk a écrit :

(j'aime pas le fait que ta fonction modifie son entrée [:rogr])


Moi non plus mais j'ai pas trouvé mieux.

n°1239935
Emmanuel D​elahaye
C is a sharp tool
Posté le 06-11-2005 à 20:48:22  profilanswer
 

thoduv a écrit :

Moi non plus mais j'ai pas trouvé mieux.


Retourner un  


struct tokens
{
   char **a;
   size_t n;
};


Message édité par Emmanuel Delahaye le 06-11-2005 à 20:48:55

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  "Segmentation Fault" avec malloc entre 757 et 1973.

 

Sujets relatifs
Erreur Segmentationsegment fault pour du C (tabl d'élément)
[C++] petit pb de seg. fault[C/C++] kernel 2.6.12 => segmentation fault
Erreur de segmentationerreur de segmentation
[ C++ ] Passer par adresse un vecteur à 2 dimensions + mallocproblème avec malloc enfin je pense ...
erreur de segmentation pourtant simple 
Plus de sujets relatifs à : "Segmentation Fault" avec malloc entre 757 et 1973.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR