Pointeurs et structures [Résolu]

Messages postés
246
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
11 septembre 2016
- - Dernière réponse : glipper
Messages postés
246
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
11 septembre 2016
- 12 juil. 2006 à 00:20
Bonjour,

j'ai declaré dans un de mes programmes une structure dans un fichier header :

typedef struct Fiche
{
    char iop[30];
} Fiche;

Ensuite, dans un fichier .c, j'ai procédé comme ceci :

                   ....
Fiche *Ami;
Ami = DownloadFiche();

free(Ami);
....

Voilà la fonction      DownloadFiche() :

Fiche* DownloadFiche()
{
    Fiche *fiche;
    ...
    fiche = (Fiche*) malloc(sizeof(Fiche)*n+1);   // avec n une variable calculée dans la fonction
  
    ....
    return fiche;
}

J'aurais deux questions sur ce programme :
<li>Tout d'abord, n'y a t'il pas de fuite mémoire en procédant comme je l'ai fait : attribuer dynamiquement de la mémoire dans la fonction DownloadFiche, puis la liberer en dehors de la fonction.</li><li>Ensuite, comment puis-je connaître le nombre de fiches que retourne la fonction ? En effet, dans la fonction, le malloc attribue de la mémoire pour n fiches. Mais comment puis-je ensuite connaître la taille de Ami ? Si je fais sizeof(Ami) je récupere la taille en octet je suppose, et strlen() c'est pour les chaines de characteres, pas pour les chaines de structure....</li>Si vous avez d'autres commentaires à faire sur ce code, n'hésitez pas à m'en faire part.
Merci d'avance,
Glipper
Afficher la suite 

5 réponses

Meilleure réponse
Messages postés
252
Date d'inscription
vendredi 10 juin 2005
Statut
Membre
Dernière intervention
5 septembre 2006
3
Merci
>fiche = (Fiche*) malloc(sizeof(Fiche)*n+1);

A quoi sert le + 1 ?

Pour la taille suffit de passer un pointeur sur int.

Fiche *Ami;
int taille;
Ami = DownloadFiche( &taille );

------------------------------------

free(Ami);
Fiche* DownloadFiche( int *size )
{
    int n = 5;
    Fiche *fiche = (Fiche*) malloc(sizeof(Fiche)*n);
    *size = n;
     return fiche;
}

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 121 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Zootella
Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012
0
Merci
Si tu ne retourne qu'un pointeur sur l'un comme c'est le cas (je ne dit pas qu'il est possible de faire autrement) alors tu as intérêt à chaîner tes fiches en interne :
struct Fiche contiendrait alors un struct Fiche *suivant
de cette manière tu peux te ballader facilement dedans, manipuler les fiches en les changeant d'emplacement et saoir le nombre de fiches (quand tu parcours l'arbre, tu compte)

<hr size="2" width="100%" />  Qui ne tente rien...

  Ne risque pas d'avoir grand chose !!!

<hr siz="" />
Commenter la réponse de mondrone
Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012
0
Merci
Sinon, car je répond peut être à côté, avec un sizeof du résultat ya pas moyen de savoir le nombre de fiches dans ton programme ?

<hr size="2" width="100%" />  Qui ne tente rien...

  Ne risque pas d'avoir grand chose !!!

<hr siz="" />
Commenter la réponse de mondrone
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
0
Merci
sizeof() donnerait 4 (taille d'un pointeur) sur system 32 et 8 sur 64 mais rien de plus intéressant.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
246
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
11 septembre 2016
1
0
Merci
Oki zootella j'y avais pensé à cette methode... je pense que je vais faire comme ça.

Sinon pour le
(Fiche*) malloc(sizeof(Fiche)*n+1);
j'ai mis le +1 car pour une chaine de charactere, on rajoute +1 pour le '\0'. Là, je savais pas trop alors dans le doute, je l'ai mis (mieux vaut trop que pas assez). Je vais l'enlever :)

Merci
Commenter la réponse de glipper