Click here to print

Structures

Les structures servent à créer des types en composants plusieurs autres types.
struct nom{

int a;
char b;
machin c;

}
Défini le nouveau type "struct nom". La taille de ce nouveau type sera typedef(struct nom). Une structure ne peut pas se contenir elle même :
struct nom{

int a;
char b;
machin c;
struct nom d; /* impossible */

}
Par contre elle peut contenir un pointeur vers une zone de type struct nom :
struct nom{

int a;
char b;
machin c;
struct nom * d; /* oui */

}
Les structures se comportent comme les variables (et pas comme les tableaux). Ca veut dire que si vous passé une structure en paramètre à une fonction, celle-ci recoit en réalité une copie locale. Les modifications ne seront pas visible, sauf pour les champs de la structure qui sont des pointeurs. Par facilité d'écriture, il est également possible de donner un nom au nouveau type défini par la structure :
typedef struc _nom{
...
}nom;

_nom et nom doivent être différents. Quand la structure ne contient pas de pointeur vers une structure de même type, le _nom devient alors optionel :
typedef struc {

}nom;

Allocation dynamique

Il est possible de demander de la mémoire en dehors de la pile, et de récupérer un pointeur vers cette mémoire. Ca se fait avec la fonction malloc. Voir le cours !

Exercices

  1. Dessiner la pile qui correspond au code suivant :
    1.  
    2. typedef struct {
    3. int a;
    4. int b;
    5. char c;
    6. }Structure;
    7. Structure fonction(Structure s){
    8. s.a=11;
    9. s.b=12;
    10. s.c='z';
    11. }
    12. int main(void){
    13. Structure s;
    14. s.a=1;
    15. s.b=2;
    16. s.c='a';
    17. s=fonction(s);
    18. return 0;
    19. }
  2. Dessiner la pile qui correspond au code suivant :
    1.  
    2. typedef struct {
    3. int a;
    4. int b;
    5. char c;
    6. }Structure;
    7. void fonction(Structure * s){
    8. (*s).a=11;
    9. (*s).b=12;
    10. s->c='z';
    11. }
    12. int main(void){
    13. Structure s;
    14. s.a=1;
    15. s.b=2;
    16. s.c='a';
    17. fonction(&s);
    18. return 0;
    19. }
  3. Si on rajoute un affichage de la structure, qu'obtient on pour le code de la question 1 ? et pour celui de la question 2 ?
  4. Écrire une fonction qui prend une chaine de caractère et renvoie une nouvelle chaine qui contient la première à l'envers
  5. Écrire une fonction qui prend une chaine de caractère et un caractère c et renvoie le plus long suffixe qui commence par ce caractère (sans faire de nouvelle allocation)
  6. Écrire une fonction qui prend une chaine de caractères et un entier n et enlève tous les caractères après le nieme (pas d'allocation)
  7. Définir une structure contenant un tableau de taille max défini à 100, et un entier qui donne la taille courante (le nombre de case occupée
  8. donner alors les fonctions pour allouer une telle structure, l'afficher (contenu du tableau plus taille max)
  9. donner la fonction qui ajoute un élément au tableau. Si le tableau est plein, un nouveau tableau doit etre alloué deux fois plus grand, les anciennes données recopiées et le nouvel entier ajouté (pensez à la fonction realloc)
  10. donner la fonction qui enlève le nieme entier. Si la taille courante devient plus petite que 1/3 de la taille max et que max n'est pas 100, la moitié de la mémoire occupée par le tableau doit être libérée.