Allocation mémoire & structure de pointeurs

Résolu/Fermé
Erdouh Messages postés 7 Date d'inscription vendredi 8 novembre 2013 Statut Membre Dernière intervention 1 mars 2014 - Modifié par Erdouh le 9/11/2013 à 22:39
Erdouh Messages postés 7 Date d'inscription vendredi 8 novembre 2013 Statut Membre Dernière intervention 1 mars 2014 - 9 nov. 2013 à 22:58
Bonjour,

Supposons que je me donne une structure de pointeurs, par exemple :
typedef struct mastruct
{
int* toto;
int* tata;
}mastruct;

Si je crée une fonction qui renvoie un pointeur sur cette structure, comment se passe l'allocation de la mémoire, d'un point de vue syntaxique notamment?
J'imagine que ma fonction commence par quelque chose comme:

mastruct* fonction(int a, int b)
{
mastruct *c;
c=(mastruct*)malloc(sizeof(mastruct));
...
...
return c;
}

Mais qu'en est-il de l'allocation de la mémoire pour les pointeurs "toto" et "tata", si je veux y mettre des valeurs ?
J'imagine que je dois quand même leur allouer un espace, qui est peut-être inclus dans l'espace de c, alors ? J'ai pensé à écrire quelque chose comme c->toto=(int*)malloc(sizeof(int)); mais ça n'a pas l'air très correct.
D'ailleurs, pour accéder à ces valeurs, est-ce qu'écrire *c->toto ou **c.toto est correct ?

Désolé si me questions ne sont pas très claires ; je n'ai pas encore beaucoup de recul sur les pointeurs, du coup, ça me paraît encore un peu flou.

Merci d'avance pour vos réponses.

A voir également:

1 réponse

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
Modifié par gravgun le 9/11/2013 à 22:18
Bonsoir, ta structure mastruct ressemblera à ça en mémoire (en assumant un CPU 32 bits; les pointeurs 64 font 8 octets):
[4 octets pour toto][4 octets pour tata]
Cette configuration sera toujours la même, et sizeof(mastruct) renverra 8, car mastruct occupe toujours 8 octets en mémoire.

Pour ta fonction qui créé cette structure, elle se charge de l'allocation avec malloc, ce qui fait que la "valeur" de
c
se trouve dans le heap, la mémoire que tu gères toi même avec malloc/calloc, realloc et free. On demande donc a allouer 8 octets, et on récupère le pointeur vers ces 8 octets dédiés à notre structure.
c
contient donc l'adresse mémoire vers la structure, c'est juste un int en réalité, mais qui indique un emplacement.

Les membres toto et tata sont des pointeurs eux aussi (imagine que çe sont des int); mais ils peuvent contenir des valeurs aléatoires: malloc ne nettoie pas la mémoire qu'on demande avant de nous passer le pointeur, d'où l'intéret de calloc qui met tout à zéro, donc les pointeurs toto et tata seront 0, donc NULL.
Ta ligne
c->toto=(int*)malloc(sizeof(int));
ne te semble pas correcte, mais elle l'est parfaitement, on associe un nouveau pointeur à toto de c, le tout joliment casté et avec la bonne taille.
Pour y accéder, la notation peut être ambigüe donc je préfère tout faire en explicite avec des parenthèses:
*(c->toto)
. Explication:
c
est un pointeur de mastruct,
->
récupères un membre de la struct pointée. On a donc récupéré un pointeur, et on veut sa valeur pointée, qui s'obtient avec
*
.
from human import idiocy
del idiocy
3
Erdouh Messages postés 7 Date d'inscription vendredi 8 novembre 2013 Statut Membre Dernière intervention 1 mars 2014
Modifié par Erdouh le 9/11/2013 à 23:12
Merci beaucoup pour cette réponse, c'est clair et précis ! :)
0