Pointeurs et structures [Résolu]

Signaler
Messages postés
246
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
11 septembre 2016
-
Messages postés
246
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
11 septembre 2016
-
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

Messages postés
252
Date d'inscription
vendredi 10 juin 2005
Statut
Membre
Dernière intervention
5 septembre 2006

>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;
}
Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012

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="" />
Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012

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="" />
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
sizeof() donnerait 4 (taille d'un pointeur) sur system 32 et 8 sur 64 mais rien de plus intéressant.

ciao...
BruNews, MVP VC++
Messages postés
246
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
11 septembre 2016
1
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