°'** Langage C **'°

Résolu
while_stri Messages postés 4 Date d'inscription vendredi 17 mars 2006 Statut Membre Dernière intervention 4 mai 2006 - 27 avril 2006 à 15:11
gwenCPP Messages postés 20 Date d'inscription vendredi 28 janvier 2005 Statut Membre Dernière intervention 14 septembre 2006 - 4 mai 2006 à 18:36
Bonjour à tous.

Je code un programme en C et j'utilise de nombreux pointeurs sur structure.  Lorsque je passe le pointeur dans un sous-programme et que je souhaite faire un free(pointeur) j'ai de nombreux bugs dans les valeurs des attributs de la structure concernée quand je refais un malloc sur le pointeur.

je code a peu près ainsi :

void sousprog (t_struct1 *pt)
{
    if (pt->x > 5)      // x est un attribut quelconque de la structure
    {
       free (pt);  
       pt=NULL;
    }
********* et dans  le main
sousprog (pt);

toute proposition est la bienvenue

7 réponses

while_stri Messages postés 4 Date d'inscription vendredi 17 mars 2006 Statut Membre Dernière intervention 4 mai 2006
4 mai 2006 à 18:26
j'ai enfin trouvé la solution de mon problème donc je la poste.

En fait il suffit de passé l'adresse du pointeur sur structure &pt au sous programme. On récupère un t_struct **pt (oui **) et on travail dans le sous programme avec un *pt.

Vous vous dites, pourquoi ça ne marchait pas avant ? si j'ai bien compris c'est à cause du fait que le sous programme créait une copie du pointeur et travaillait dessus et elle était supprimée en fin de sous programme. Alors que là on travail directement sur le pointeur original du main. Une autre solution consiste à faire un return pt; en fin de sous programme (qui ne sera plus un void du coup). A vérifier

en espérant que ça aide qq'un un jour ^^

merci encore à Gwen pour ses réponses
3
gwenCPP Messages postés 20 Date d'inscription vendredi 28 janvier 2005 Statut Membre Dernière intervention 14 septembre 2006
27 avril 2006 à 15:18
Hello,

Peux tu nous en dire plus sur la message d'erreurs pour indices.
Comment déclare tu le pt dans le main? L'élément passé en argument a-t-il été alloué avec un malloc???
As-tu essayé la fonction realloc???

Gwen
0
while_stri Messages postés 4 Date d'inscription vendredi 17 mars 2006 Statut Membre Dernière intervention 4 mai 2006
27 avril 2006 à 15:40
Merci pour cette réponse aussi rapide ^^

je déclare mon pointeur ainsi : t_struct1 *pt=NULL;

ensuite je fais un malloc : pt = (t_struct1*) malloc (sizeof(t_struct1));

je n'ai pas essayé avec realloc, quelle est la différence avec un malloc classique ?

ce que je ne comprend pas c'est que lorsque je fais ça sur un élément d'un tableau de pointeur sur structure ca marche parfaitement, mais sur un pointeur simple non.

je précise que je n'ai aucun message d'erreur de la part du compilateur, seul l'exe crash au bout d'un certains temps
0
gwenCPP Messages postés 20 Date d'inscription vendredi 28 janvier 2005 Statut Membre Dernière intervention 14 septembre 2006
27 avril 2006 à 16:10
Le realloc peut convenir dans ton cas;

il s'agit de ré-allouer une variable auparavant allouées par un malloc :

Trouvé sur msdn :

Reallocate memory blocks.

void*realloc( void*[ memblock], size_t[ size]);

Parameters
* memblock : Pointer to previously allocated memory block.
<dt>size
New size in bytes.

Return Value
realloc returns a void pointer to the reallocated (and possibly moved) memory block. The return value is NULL if the size is zero and the buffer argument is not NULL, or if there is not enough available memory to expand the block to the given size. In the first case, the original block is freed. In the second, the original block is unchanged. The return value points to a storage space that is guaranteed to be suitably aligned for storage of any type of object. To get a pointer to a type other than void, use a type cast on the return value.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
while_stri Messages postés 4 Date d'inscription vendredi 17 mars 2006 Statut Membre Dernière intervention 4 mai 2006
27 avril 2006 à 20:44
"Ceci est donc utile pour un tableau dynamique : en effet, on peut
ajouter ou enlever une case à la fin du tableau sans le modifier."

c'est ce que j'ai trouvé sur le net. En fait cette fonction sert surtout si on veut changer la taille du pointeur or pour ma part il garde la mm taille. Mais bn c'était une possibilité
0
gwenCPP Messages postés 20 Date d'inscription vendredi 28 janvier 2005 Statut Membre Dernière intervention 14 septembre 2006
28 avril 2006 à 08:40
Ok,

mais au passage, tu peux réallouer la même taille si tu le souhaites, mais je ne vois pas l'intérêtde libérer cette mémoire si tu sais qu'elle sera toujours de la même taille. Autant la remettre à 0 tout simplement.

Sinon peut tu me mettre un exemple de programme complet et simple de ce que tu fais, que je compilerais chez moi pour voir ce qu'il se passe exactement.

A++
Gwen
0
gwenCPP Messages postés 20 Date d'inscription vendredi 28 janvier 2005 Statut Membre Dernière intervention 14 septembre 2006
4 mai 2006 à 18:36
Nikel comme réponse, ça me va, il ne te reste plus qu'à valider ta réponse.

++

Gwen
0
Rejoignez-nous