OVH Cloud OVH Cloud

structures et blocs mémoire

37 réponses
Avatar
Nicolas Aunai
salut !

comment sont organisées en mémoire les données membre d'une structure ?
par exemple si je déclare :

struct nom_s{

char *buffer1;
char *buffer2;
}


struct nom_s buf_s;

et qu'ensuite, dans mon code, je file l'adresse de cette structure a
une de mes fonctions, cette fonction est chargée d'enregistrer des
résultats dedans, et doit donc au préalable allouer de la mémoire pour
les buffer :

buf_s->buffer1=malloc(taille);
buf_s->buffer2=malloc(taille2);

où sont dans la mémoire le buffer 1 et le buffer2 ? comment sont ils
placés, sachant qu'il doit bien y avoir quelque chose qui fait qu'ils
appartienent a la structure buf_s.


--
Nico,
http://astrosurf.com/nicoastro

10 réponses

1 2 3 4
Avatar
Yves ROMAN

salut !

comment sont organisées en mémoire les données membre d'une structure ?


les unes après les autres, avec éventuellement du padding

par exemple si je déclare :

struct nom_s{

char *buffer1;
char *buffer2;
}

struct nom_s buf_s;



La zone memoire de taille sizeof(struct nom_s)
contient
- une zone de taille sizeof(char *) contenant le membre buffer1
- une éventuelle zone de padding pour aligner le champ suivant (ici surement
vide)
- une zone de taille sizeof(char *) contenant le membre buffer2
- une éventuelle zone de padding pour aligner la fin de la structure (ici
surement vide)
Elle est située dans la partie de la mémoire utilisée pour les variables locales
(par exemple STACK) ou celle des variables globales (par exemple DATA) selon
qu'elle est déclarée dans une fonction ou pas.


et qu'ensuite, dans mon code, je file l'adresse de cette structure a
une de mes fonctions, cette fonction est chargée d'enregistrer des
résultats dedans, et doit donc au préalable allouer de la mémoire pour
les buffer :

buf_s->buffer1=malloc(taille);
buf_s->buffer2=malloc(taille2);

où sont dans la mémoire le buffer 1 et le buffer2 ? comment sont ils
placés, sachant qu'il doit bien y avoir quelque chose qui fait qu'ils
appartienent a la structure buf_s.



buffer1 et buffer2 sont dans buf_s (voir ci-dessus) par définition.
Mais ils contiennent chacun une adresse qui pointent vers 2 autres zones
mémoires qui n'ont rien à voir avec la structure et sa position en memoire.
Ces 2 zones se trouvent dans la partie de la mémoire utilisée pour les
allocations dynamiques (par exemple HEAP)

Avatar
Marc Boyer
In article , Nicolas Aunai wrote:
salut !

comment sont organisées en mémoire les données membre d'une structure ?
par exemple si je déclare :

struct nom_s{
char *buffer1;
char *buffer2;
}


struct nom_s buf_s;


buf_s est une zone mémoire contigue dont la taille est
supérieure ou égale à sizof(char*) * 2.

buf_s->buffer1=malloc(taille);
buf_s->buffer2=malloc(taille2);

où sont dans la mémoire le buffer 1 et le buffer2 ? comment sont ils
placés, sachant qu'il doit bien y avoir quelque chose qui fait qu'ils
appartienent a la structure buf_s.


De quoi parles-tu ? De la variable buffer1 ou de la mémoire pointée
par buffer1 (buffer1[i] avec O<=i<buffer1).
La variable buffer1 est "dans" buf_s
(&buf_s <= &(buf_s.buffer1) <= &buf_s +sizeof(buf_s))
Sinon, non, rien ne permet de retrouver buffer1 à partir
de la lecture de buffer[i].

Pour prendre une analogie (foireuse), si tu achètes
un PC (mémoire allouée) tu as un bon de garantie (buffer1),
qui dit que tu es propriétaire de ce PC là (num° de série)
mais si tu perds ce bon, rien ne permet de retrouver le
propriétaire à partir du PC.

Marc Boyer, pas très satisfait de son explication...
--
Lying for having sex or lying for making war? Trust US presidents :-(

Avatar
Stephane Legras-Decussy
"Nicolas Aunai" @free.fr> a écrit dans le message news:

où sont dans la mémoire le buffer 1 et le buffer2 ? comment sont ils
placés, sachant qu'il doit bien y avoir quelque chose qui fait qu'ils
appartienent a la structure buf_s.


du point de vue du C,
j'aurais envie de te dire "qu'est que ça peut te faire ?"

pourquoi tu veux savoir ça ? car ce n'est plus du C ...

du point de vue de la culture informatique, ok, tu peux te poser
la question... mais c'est HS ... ;-)

Avatar
Nicolas Aunai
"Stephane Legras-Decussy" a utilisé son clavier pour écrire :

du point de vue du C,
j'aurais envie de te dire "qu'est que ça peut te faire ?"

pourquoi tu veux savoir ça ? car ce n'est plus du C ...

du point de vue de la culture informatique, ok, tu peux te poser
la question... mais c'est HS ... ;-)



hum... ça a pourtant l'air d'etre du C, les structures, les pointeurs,
les allocations, la fonction malloc etc... tout ça fait partie du C, et
si je veux savoir, c'est par curiosité :)

bon j'ai pigé qu'en fait la structure contient deux pointeurs, j'aurai
pu y penser moi meme, ce sont des pointeurs, donc ont juste l'adresse
de la mémoire allouée... la taille de la structure reste inchangée...

j'insiste encore un peu alors, dans ce pseudo HS (si pas là, dites moi
ou poster)

comment sont orgranisées les données en mémoire précisément ?
j'veux dire, la structure, c un truc qui "englobe" des variables... si
on veut accéder a un de ses membres on doit préciser tout d'abords le
nom de la structure, comment cela est-il représenté dans la mémoire ?
comment l'ordinateur sait-il que telle zone mémoire est sous la
dépendance d'une structure et non une variable quelconque ?


--
Nico,
http://astrosurf.com/nicoastro

Avatar
Marc Boyer
Nicolas Aunai wrote:
"Stephane Legras-Decussy" a utilisé son clavier pour écrire :

du point de vue de la culture informatique, ok, tu peux te poser
la question... mais c'est HS ... ;-)



hum... ça a pourtant l'air d'etre du C, les structures, les pointeurs,
les allocations, la fonction malloc etc... tout ça fait partie du C, et
si je veux savoir, c'est par curiosité :)


C'est tout à fait en charte en fait, si on s'en tient
à des considérations simples.

comment sont orgranisées les données en mémoire précisément ?
j'veux dire, la structure, c un truc qui "englobe" des variables... si
on veut accéder a un de ses membres on doit préciser tout d'abords le
nom de la structure, comment cela est-il représenté dans la mémoire ?
comment l'ordinateur sait-il que telle zone mémoire est sous la
dépendance d'une structure et non une variable quelconque ?


Quelle différence fais-tu entre une structure et une variable
quelconque ?
Si je prends un int, comment savoir que le deuxième octet
est relié au premier ?
Une structure est une variable "assez grande" pour y mettre
plusieurs éléments. Tout ce qui entre le début et la fin
de la structure appartient à la structure.

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(


Avatar
Nicolas Aunai
"Marc Boyer" avait écrit le 04/09/2003 :

Quelle différence fais-tu entre une structure et une variable
quelconque ?
Si je prends un int, comment savoir que le deuxième octet
est relié au premier ?
Une structure est une variable "assez grande" pour y mettre
plusieurs éléments. Tout ce qui entre le début et la fin
de la structure appartient à la structure.


ok alors mes questions venaient du fait qu'il y a des "variables dans
une structure"...
ta réponse implique alors une autre question :

a quoi reconnait-on le début d'une variable en mémoire ? et surtout sa
fin ?
le début est marqué par l'adresse de cette variable ok.. mais qui
"connait" cette adresse pour retrouver la variable en cas de besoin ?
et la fin ? est-elle repérée par l'adresse de début+taille ? si oui qui
connait la taille ?


Marc Boyer




--
Nico,
http://astrosurf.com/nicoastro

Avatar
Marc Boyer
Nicolas Aunai wrote:
"Marc Boyer" avait écrit le 04/09/2003 :

ok alors mes questions venaient du fait qu'il y a des "variables dans
une structure"...
ta réponse implique alors une autre question :

a quoi reconnait-on le début d'une variable en mémoire ? et surtout sa
fin ?


Sa fin, c'est son début+sa taille.

le début est marqué par l'adresse de cette variable ok.. mais qui
"connait" cette adresse pour retrouver la variable en cas de besoin ?
et la fin ? est-elle repérée par l'adresse de début+taille ? si oui qui
connait la taille ?


Qui connait la taille d'une variable ? Ben, sizeof te la donne.

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

Avatar
Nicolas Aunai
"Marc Boyer" a pensé très fort :

Qui connait la taille d'une variable ? Ben, sizeof te la donne.


hum, c pas vraiment ça que je voulais dire on s'est mal compris.
dans le cas ou j'utilise une variable dans un code quelconque.

comment l'ordinateur sait-il où s'arreter dans la lecture de la varible
pour retourner sa valeur ? avec son type ? genre un int il lira 4
octets...


Marc Boyer




--
Nico,
http://astrosurf.com/nicoastro

Avatar
Marc Boyer
In article , Nicolas Aunai wrote:
"Marc Boyer" a pensé très fort :

Qui connait la taille d'une variable ? Ben, sizeof te la donne.


hum, c pas vraiment ça que je voulais dire on s'est mal compris.
dans le cas ou j'utilise une variable dans un code quelconque.

comment l'ordinateur sait-il où s'arreter dans la lecture de la varible
pour retourner sa valeur ? avec son type ? genre un int il lira 4
octets...


Ben lui aussi connait "sizeof" de ta variable (d'ailleurs, c'est lui
qui te la calcule).
Disons que souvent, un processeur connait plusieurs "tailles" de lecture.
Imaginons un proc qui sache lire 2 ou 4 octets à la fois. Si en C tu
demandes à lire 1 octet, il en lit 2, et ne garde que celui qui t'intéresse.
Si tu demandes 2 ou 4 octets, c'est facile. Et si tu en demandes 9,
il en lire surement 4 puis 4 puis 2, et oubliera celui en trop.
C'est le boulot du compilateur, qui connait "sizeof" (c'est même
lui qui décide quelle valeurr ça aura) de décomposer un acces
en autant d'acces processeur que nécessaire.

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(


Avatar
Bruno
dans l'article bj7kuj$3ig$, Marc Boyer à
a écrit le 04/09/2003 17:15 :

In article , Nicolas Aunai wrote:
"Marc Boyer" a pensé très fort :

Qui connait la taille d'une variable ? Ben, sizeof te la donne.


hum, c pas vraiment ça que je voulais dire on s'est mal compris.
dans le cas ou j'utilise une variable dans un code quelconque.

comment l'ordinateur sait-il où s'arreter dans la lecture de la varible
pour retourner sa valeur ? avec son type ? genre un int il lira 4
octets...


Ben lui aussi connait "sizeof" de ta variable (d'ailleurs, c'est lui
qui te la calcule).
Disons que souvent, un processeur connait plusieurs "tailles" de lecture.
Imaginons un proc qui sache lire 2 ou 4 octets à la fois. Si en C tu
demandes à lire 1 octet, il en lit 2, et ne garde que celui qui t'intéresse.
Si tu demandes 2 ou 4 octets, c'est facile. Et si tu en demandes 9,
il en lire surement 4 puis 4 puis 2, et oubliera celui en trop.
C'est le boulot du compilateur, qui connait "sizeof" (c'est même
lui qui décide quelle valeurr ça aura) de décomposer un acces
en autant d'acces processeur que nécessaire.

Marc Boyer


je pense que "l'architecture" du type est stockée (sa taille et son
organisation).

comme les types primaires int, char, ect..

non?
--
Bruno Causse
http://perso.wanadoo.fr/othello



1 2 3 4