Pointeur générique et liste chaînée
Salut,
Dans le but d'appronfondir ma pratique sur la généricité et la manipulation de liste chaînée, je souhaiterai effectuer l'opération suivante. On dit que le pointeur générique peut pointer vers n'importe quel type d'objet.
Imaginons que je déclare:
Code:
1 2 3 4 5 6 7 8 9 10
|
struct liste{
int nb_elt;
struct noeud* noeud;
};
struct noeud {
void* element;
void* next;
}; |
Dans ce cas, element est le pointeur générique qui pointe vers l'objet que je désire utiliser dans mon application. Dans mon application, j'utilise des fonctions qui effectuent des opérations sur les listes telles que enlever un élément, avoir la taille, savoir si on est en fin de liste, etc... .
Si je veux que element pointe vers un élément de type structure comme celle ci par exemple:
Code:
1 2 3 4 5 6
|
struct idy_t {
char* s1;
char* s2;
int i1;
}; |
Pour tester ce que cela donnerait, j'ai fait un petit test avec le programme suivant:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Vcard{
char* nom;
char* prenom;
char* tel;
}VCard_t;
int init_vcard(VCard_t** vcard)
{
(*vcard) = malloc(sizeof*(*vcard));
if (NULL == (*vcard)) return -1;
(*vcard)->nom = malloc(sizeof*((*vcard)->nom));
(*vcard)->prenom = malloc(sizeof*((*vcard)->prenom));
(*vcard)->tel = malloc(sizeof*((*vcard)->tel));
return 0;
}
int set_vcard(VCard_t* vcard, const char* n, const char* p, const char* t)
{
if (vcard)
{
if (NULL != n) strcpy(vcard->nom,n);
if (NULL != p) strcpy(vcard->prenom,p);
if (NULL != t) strcpy(vcard->tel,t);
return 0;
}
return -1;
}
int main ( void )
{
void * ptr = NULL;
int i;
VCard_t* client;
i = init_vcard(&client);
if (i != 0)
{
fprintf(stderr,"[ERROR] Initialisation VCard!!");
exit(-1);
}
i = set_vcard(client, "R", "J", "03020066634");
if (i != 0)
{
fprintf(stderr,"[ERROR] Initialisation VCard!!");
exit(-1);
}
ptr = &client;
printf("-------------------------------------\n");
printf("---------Pointeur generique----------\n");
printf("Adresse pointeur gen:%p\n",ptr);
printf("Adresse ptr structure:%p\n",client);
printf("-------------------------------------\n");
return EXIT_SUCCESS;
} |
Ce que je n'arrive pas à comprendre, c'est pourquoi l'adresse du pointeur générique en sortie du programme n'est pas la même que celle de la structure. Il devrait normalement pointer vers l'adresse de client. Je crois qu'il y a un point que je n'ai pas saisi. Si ça ne marche pas sur ce petit programme, je pense que pour ce que je voudrais faire avec les listes échouera aussi. Et puis, comme le pointeur générique ne sait pas vers quel type d'objet il pointe, je pourrai jamais utiliser les notations . ou -> pour les structures.
Cordialement,
Johnny