Allocation mémoire & structure de pointeurs
Résolu
Erdouh
Messages postés
7
Date d'inscription
Statut
Membre
Dernière intervention
-
Erdouh Messages postés 7 Date d'inscription Statut Membre Dernière intervention -
Erdouh Messages postés 7 Date d'inscription Statut Membre Dernière intervention -
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.
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:
- Allocation mémoire & structure de pointeurs
- Mémoire vive - Guide
- RAM : type, format, CAS, vitesse, tout sur la mémoire vive - Guide
- Logiciel calcul structure bois gratuit - Télécharger - Architecture & Déco
- Structure d'un rapport de stage - Guide
- Nettoyer memoire iphone - Guide
1 réponse
Bonsoir, ta structure mastruct ressemblera à ça en mémoire (en assumant un CPU 32 bits; les pointeurs 64 font 8 octets):
Pour ta fonction qui créé cette structure, elle se charge de l'allocation avec malloc, ce qui fait que la "valeur" de
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
Pour y accéder, la notation peut être ambigüe donc je préfère tout faire en explicite avec des parenthèses:
from human import idiocy
del idiocy
[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
cse 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.
ccontient 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:
cest 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
Erdouh
Messages postés
7
Date d'inscription
Statut
Membre
Dernière intervention
Merci beaucoup pour cette réponse, c'est clair et précis ! :)