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
Emmanuel Delahaye
In 'fr.comp.lang.c', Marc Boyer wrote:

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

comme les types primaires int, char, ect..

non?


Il est probable que, pour une architecture donnée, taille
et organisation des types primaire soit fixe.
Mais on peut imaginer un compilateur qui proposerait à l'utilisateur
de choisir la taille des entiers comme option de compilation.


Ca ne fait que modifier le code produit. Rien de magique. Le processeur se
contente de faire ce qu'on lui dit de faire. Point.

Mais après, il y a les types utilisateurs: enum et struct.


Les enums ne sont de de simples constantes (valeurs immédiates). Les
structures sont des agrégats de données accessibles par le couple base +
offset. Rien de magique. Ensuite, le type détermine l'usage de la bonne
instruction ou du groupe d'instruction nécessaire à l'accès si celui-ci n'est
pas basique.

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/


Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Bruno wrote:

dans l'article 136pii7rrct4s$, Serge Paccalin à
a écrit le 04/09/2003 17:41 :

C'est le compilateur qui le sait, et qui génère du code qui fait ce que
tu lui demandes. Il le sait parce que son concepteur l' a écrit comme
ça, avec les choix d'implantation en tête.


mais bien sur :)


Ben oui. Si tu as une remarque à faire, soit plus précis.

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/


Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Bruno wrote:

il me semble que la question etait comment et ou est stocké
"l'architecture" d'une structure


Elle n'est pas stockée explicitement. Elle est connue du compilateur qui
ecrit le code assembleur (ou machine) qui va bien pour accéder à la donnée.

ex :un int suivi d'un char puis d'un pointeur etc

puis par approfondissement

un int = 4 ou + octets
char = 1 ou +
pointeur...


--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Nicolas Aunai
ok merci a tous pour ces explications !


Si ces détails t'interessent (inutile en C, mais utile pour la culture
générale), je te conseille d'étudier le langage assembleur de ton
implémentatrion et d'aller voir le code généré. (Souvent, une option de
compilaton permet de conserver le code assembleur produit par le
compilateur).




hum... pas bcp de temps pour l'assembleur, bien que ce soient encore
les vacances pour moi.. pas que ça a faire, c'était juste de la
curiosité.



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

Avatar
Dominique Baldo
Nicolas Aunai nous disait
hum... pas bcp de temps pour l'assembleur, bien que ce soient encore
les vacances pour moi.. pas que ça a faire, c'était juste de la
curiosité.


On peut faire du C et comprendre les pointeurs, les tableaux et autres
sans avoir fait d'assembleur ... mais ça aide bien d'en avoir fait.

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Dominique Baldo wrote:

Nicolas Aunai nous disait
hum... pas bcp de temps pour l'assembleur, bien que ce soient encore
les vacances pour moi.. pas que ça a faire, c'était juste de la
curiosité.


On peut faire du C et comprendre les pointeurs, les tableaux et autres
sans avoir fait d'assembleur ... mais ça aide bien d'en avoir fait.


Tout à fait. Ca concrétise les choses, et ça évite de phantasmer.

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/


Avatar
Bertrand Mollinier Toublet
Nicolas Aunai wrote:

"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 ?

Ne t'y meprends pas: les structures ne sont qu'un artifice semantique du

langage. Par exemple, sur une architecture Intel (juste pour ne pas dire
"en general", afin d'exclure la DS9000), une fois ton code compile, la
machine n'a aucune idee de qui est une strucure ou quoi. Tout se passe
en terme d'acces au bon endroit en memoire. C'est au moment de la
compilation que ton compilateur va transformer la syntaxe de structure
(x.y ou px->y) en acces au bon endroit en memoire...

--
Bertrand Mollinier Toublet
int main(){char*strchr();int j34;char t[]=":@abcdefghij-lmnopqrstuv"
"wxyz.n",*i="iqgbgxmbbla.llsvoaz:";while
(*i){j+=strchr(t,*i++)-t;j%=sizeof t-1;putchar(t[j]);}return 0;}


Avatar
Nicolas Aunai
"Bertrand Mollinier Toublet" a exposé le 05/09/2003 :


Ne t'y meprends pas: les structures ne sont qu'un artifice semantique du
langage. Par exemple, sur une architecture Intel (juste pour ne pas dire "en
general", afin d'exclure la DS9000), une fois ton code compile, la machine
n'a aucune idee de qui est une strucure ou quoi. Tout se passe en terme
d'acces au bon endroit en memoire. C'est au moment de la compilation que ton
compilateur va transformer la syntaxe de structure (x.y ou px->y) en acces au
bon endroit en memoire...


je m'en doutais un peu... cependant le C est un langage avec tout de
même plus de transparance pour ce qui se passe en mémoire qu'un langage
de plus haut niveau, alors forcément, ça éveille la curiosité :)



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

Avatar
Marc Boyer
Emmanuel Delahaye wrote:
In 'fr.comp.lang.c', Marc Boyer wrote:

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

comme les types primaires int, char, ect..


Il est probable que, pour une architecture donnée, taille
et organisation des types primaire soit fixe.
Mais on peut imaginer un compilateur qui proposerait à l'utilisateur
de choisir la taille des entiers comme option de compilation.


Ca ne fait que modifier le code produit. Rien de magique. Le processeur se
contente de faire ce qu'on lui dit de faire. Point.


Ce n'est pas magique en effet (ceci dit, j'espère bien que
de manière générale, il y a peu de magie dans ma machine).
C'était juste pour dire que l'architecture du type
n'était pas forcément fixe.
Ceci dit, en y réfléchissant après une bonne nuit de sommeil,
l'existence d'une ABI doit limiter quand même les variations.
Puisque l'ABI implique qu'on puisse lier des sources compilés
avec deux compilateurs différents, la taille des types de
base doit être fixée pour une plateforme donnée.

Mais après, il y a les types utilisateurs: enum et struct.


Les enums ne sont de de simples constantes (valeurs immédiates). Les
structures sont des agrégats de données accessibles par le couple base +
offset. Rien de magique. Ensuite, le type détermine l'usage de la bonne
instruction ou du groupe d'instruction nécessaire à l'accès si celui-ci n'est
pas basique.


Voui, mais le calcul de l'offset est laissé à la charge du compilateur,
qui définit le "padding" qui lui semble optimal, non ?
Ce que je n'arrive pas à voir (et qui doit surement être écrit
quelque part), c'est si on peut lier deux codes qui manipulent
les mêmes structures mais compilés avec des règles de padding différentes.

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



Avatar
Gabriel Dos Reis
Emmanuel Delahaye writes:

| Tout à fait. Ca concrétise les choses, et ça évite de phantasmer.
^^

Vraiment ? ;-)

-- Gaby
1 2 3 4