« Programmation C/Types avancés » : différence entre les versions

Contenu supprimé Contenu ajouté
Tpierron (discussion | contributions)
Ligne 73 :
Il s'agit d'un concept relativement avancé, mais qu'il est bien de connaitre pour agir en connaissance de cause. Lorsqu'on déclare une structure, on pourrait naïvement croire que les champs se suivent les uns à la suite des autres en mémoire. Or, il arrive souvent qu'une partie de la mémoire ne soit pas utilisée.
 
Considérez quequ'on nous travaillonstravaille sur un environnement où le « mot machine » fait 4 octets32bits, et où un <tt>char</tt> occupe un octet, et <tt>int</tt> 4. considérezqu'on maintenantdéclare la structure suivante:
 
<source lang="c">
Ligne 89 :
Ce comportement est en fait, non seulement dépendant de l'architecture, mais aussi du compilateur. Ce dernier possède en général des options qui permettent de paramétrer avec quelle finesse se fera l'alignement. Ces options sont bien évidemment spécifiques et pas du tout portables.
 
Dans le cas d'un ordinateur dit « 32 bits », par exemple (i.e. dont le processeur central utilise des ''registres'' de 32 bits), il est courant que la mémoire ne puisse être adressée directement que par « bloc » de 32 bits. En se représentant la mémoire comme un tableau continu, on peut tracer le dessin suivant:
 
<pre>
Ligne 140 :
Sur une architecture 32 bits, vous obtiendrez très certainement la réponse:
<pre>L'offset de 'champ2' vaut 4.</pre>
 
En fait toute cette section était pour souligner le fait qu'il est difficilement portable de comparer les structures comme des blocs binaires (via la fonction <code>memcmp</code> par exemple), car il n'y a aucune garantie que ces octets de bourrage soient intialisés à une certaine valeur. Si vous voulez comparer une structure, il est nécessaire d'y procéder champ par champ.
 
=== Pointeurs vers structures ===