Pointeurs et structures

Résolu
glipper Messages postés 246 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 11 septembre 2016 - 11 juil. 2006 à 21:36
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

5 réponses

Zootella Messages postés 252 Date d'inscription vendredi 10 juin 2005 Statut Membre Dernière intervention 5 septembre 2006
12 juil. 2006 à 00:14
>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;
}
3
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012
11 juil. 2006 à 21:45
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="" />
0
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012
11 juil. 2006 à 21:46
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="" />
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 juil. 2006 à 22:50
sizeof() donnerait 4 (taille d'un pointeur) sur system 32 et 8 sur 64 mais rien de plus intéressant.

ciao...
BruNews, MVP VC++
0

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

Posez votre question
glipper Messages postés 246 Date d'inscription dimanche 2 juin 2002 Statut Membre Dernière intervention 11 septembre 2016 1
12 juil. 2006 à 00:20
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
0
Rejoignez-nous