"Segmentation Fault" avec malloc entre 757 et 1973.

"Segmentation Fault" avec malloc entre 757 et 1973. - C - Programmation

Marsh Posté le 03-11-2005 à 21:11:49    

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 !

Reply

Marsh Posté le 03-11-2005 à 21:11:49   

Reply

Marsh Posté le 03-11-2005 à 21:18:30    

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().

Reply

Marsh Posté le 03-11-2005 à 21:41:37    

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 ?

Reply

Marsh Posté le 03-11-2005 à 21:49:03    

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
Reply

Marsh Posté le 04-11-2005 à 20:36:28    

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 ...

Reply

Marsh Posté le 04-11-2005 à 20:46:40    

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.

Reply

Marsh Posté le 05-11-2005 à 12:17:43    

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/
Reply

Marsh Posté le 05-11-2005 à 13:43:05    

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. }

Reply

Marsh Posté le 05-11-2005 à 13:58:36    

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

Reply

Marsh Posté le 05-11-2005 à 14:05:21    

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

Reply

Marsh Posté le 05-11-2005 à 14:05:21   

Reply

Marsh Posté le 05-11-2005 à 16:31:04    

(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
Reply

Marsh Posté le 06-11-2005 à 20:27:15    

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.

Reply

Marsh Posté le 06-11-2005 à 20:48:22    

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/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed