Bonjour,
En regardant les bouts de codes les un à la suite des autres, j'ai peut-être une piste qui peut t'aider :
1 2
| tmp=(bigint)malloc(sizeof(struct biginteger)); // aucun malloc de digits
tmp=nb1; |
1 2 3 4
| sous=(bigint)malloc(sizeof(struct biginteger));
sous->taille=1;
sous->digits=(char *)malloc(1);
sous->digits[0]='1'; |
1 2 3
| resultat=(bigint)malloc(sizeof(struct biginteger));
resultat->digits=(char *)malloc(1000);
resultat=nb1; |
Je ne me souviens plus trop du comportement des pointeurs dans une structure (ca fait 2ans que j'ai pas touché de la progra je m'y remets seulement, c'est comme le vélo, il paraît que ça s'oublie pas ), mais l'un des deux cas suivants se présente (je ne me souviens plus, Honte !!! Honte !!! Harot sur l'hérétique !!! ) :
- Quand tu fais "tmp=nb1" ou "resultat=nb1" tes mallocs n'ont servi à rien (à par créer une fuite mémoire pour le troisième bout de code cité
) car tes "digits" pointent au même endroit. Avec le risque suivant : quand tu modifies les valeurs du "digits" d'une des structs, les valeurs du "digits" de l'autre struct est aussi modifé.
- Ou tu risques le dépassement de mémoire si la mémoire allouée au "digits" de "nb1" est supérieure à la mémoire allouée au "digits" de "tmp" ou de "résultat". En effet on voit que tu n'alloues pas forcément la même taille à chaque fois.
J'aimerais pouvoir te confirmer quel cas est le bon, mais je n'ai pas de quoi tester sur ce poste.
Comme dit avant, ça fait un moment que j'ai pas toucher de progra, donc je peux me tromper (et y'aura donc sûrement du monde pour choisir le bon cas et/ou corriger les bêtises que j'ai pu dire), voilà juste une piste à suivre.
J'ai jamais été fan de l'affectation de deux structs ensemble par l'opérateur '='. Je préfère utiliser une fonction qui s'occupe de ça en faisant les affectation champ par champ ainsi que les contrôles nécessaires sur la mémoire. Dans le cas de champs à pointeur, s'assurer que la mémoire allouée est suffisante et faire des memcpy() ou une fonction équivalente de ton cru. Ca implique aussi du coup de modifier l'ensemble de ton programme pour chaque affectation.
En espérant que ça puisse te guider vers la résolution de ton problème.
Courage .
Partager