[Résolu] Chevauchement de mémoire

Chevauchement de mémoire [Résolu] - C - Programmation

Marsh Posté le 25-06-2009 à 23:43:26    

Y'a vraiment un truc que je pige pas là...
 
Voila le souci : dans un (gros) programme en C, j'ai deux tableaux de structures (différentes entre elles, appelons-les tata et toto, comme on nous l'a bien appris en cours d'algo).
Le problème, c'est que quand je donne une valeur à une des variables d'un élément de mon tableau de structure tata, ça me met à jour avec cette même valeur une des variables d'un élément de mon tableau de structure toto... [:sovxx]  
 
Je me demandais si vous aviez déjà vu ça. Ca pourrait venir d'un chevauchement dans la mémoire qui fait que ces deux variables partagent la même adresse ? (J'y pense en l'écrivant, j'ai pas encore maté la valeur des adresses, ça pourrait être un bon début...)
 
Et le mieux, c'est que ça ne me fait pas la même chose suivant les compilateurs ! Sous windows, je n'ai aucun problème (mais je ne sais plus quel compilateur j'utilise, faudrait que je re-regarde), alors que sous Linux (gcc), ça me le fait.
 
 [:turkleton]
 
EDIT : J'y crois pas, c'est bien ça, les deux variables ont la même adresse...  [:arrakys]  Y'a pas assez de mémoire sur mon ordi pour pas trouver deux segments différents ou quoi !?
Bin me v'la bien dans le caca, va falloir (ab)user du malloc... C'est la première fois que ça m'arrive, c'est courant ?
Autre question tant que j'y suis : quand estimez-vous qu'un malloc se justifie par rapport à juste déclarer la variable directement (avec allocation automatique par l'OS) ? Y'a une rêgle, ou bien chacun fait selon sa sensibilité ? (je précise que tous mes tableaux ont une dimension déterminée directement dans le code, pas à l'éxecution)


Message édité par Turkleton le 26-06-2009 à 02:07:58

---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 25-06-2009 à 23:43:26   

Reply

Marsh Posté le 26-06-2009 à 01:17:57    

C'est un problème très courant quand on a un code source buggué.

Reply

Marsh Posté le 26-06-2009 à 01:52:00    

bjone a écrit :

C'est un problème très courant quand on a un code source buggué.


Qu'est-ce que tu entends par "buggué" exactement ? Déclaration de mes variables ? Non-utilisation du malloc ?
 
J'aimerais bien savoir par quel chemin partir pour supprimer ce problème (que je contourne pour l'instant en utilsant un indice plus élevé dans mon premier tableau : autre adresse donc pas de chevauchement, mais c'est pas propre...)


---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 26-06-2009 à 02:07:08    

[MODE LA GROSSE HONTE ON]
Ok, je viens de voir où était buggé mon code... Forcément, c'est pas bien de déclarer un tableau avec un certain nombre d'éléments au tout début de la naissance du programme, puis quelques mois plus tard avoir initialisé de plus en plus d'éléments de ce tableau... jusqu'à dépasser le chiffre de la déclaration...

Code :
  1. Mastruct une_struct[5];
  2. ...
  3. une_struct[8] = de la merde... ou en tout cas ce qui suivait dans la mémoire....


 
 [:squrrel]  
 
En tout cas merci Bjone, grâce à toi je me suis replongé dans mon code et j'ai enfin trouvé la testicule dans le potage !


---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 26-06-2009 à 09:14:08    

En fait je voulais que tu nous communique ton code source, mais si t'as trouvé tout seul tant mieux :D
 
Mais la prochaine fois du source ou rien :)

Message cité 1 fois
Message édité par bjone le 26-06-2009 à 09:15:29
Reply

Marsh Posté le 26-06-2009 à 10:44:53    

bjone a écrit :

En fait je voulais que tu nous communique ton code source, mais si t'as trouvé tout seul tant mieux :D
 
Mais la prochaine fois du source ou rien :)


Ca aurait été compliqué, 40 Ko de code répartis sur 7 fichiers .c (et autant de .h), t'aurais eu de la lecture !  ;)


---------------
If you think it could look good, then I guess it should
Reply

Sujets relatifs:

Leave a Replay

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