FAQ CConsultez toutes les FAQ

Nombre d'auteurs : 27, nombre de questions : 175, dernière mise à jour : 17 décembre 2010  Ajouter une question

 

Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums de www.developpez.com et de l'expérience personnelle des auteurs.

Je tiens à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes ; les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, lisez ceci .

Sur ce, je vous souhaite une bonne lecture.


SommaireLes types et les variablesStructures et unions (6)
précédent sommaire suivant
 

Code c : Sélectionner tout
1
2
3
4
typedef struct { 
    int x; 
    int y; 
} POINT2D;
Ou :

Code c : Sélectionner tout
1
2
3
4
5
6
struct point2d_s { 
    int x; 
    int y; 
}; 
  
typedef struct point2d_s POINT2D;
Ou encore:

Code c : Sélectionner tout
1
2
3
4
typedef struct point2d_s { 
    int x; 
    int y; 
} POINT2D;

Mis à jour le 1er février 2003 gl LFE Melem

Comment créer un synonyme d'un type existant ?

Une structure est composée de différents champs qui ne se chevauchent pas.

Code c : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h> 
  
struct point_s { 
    int x; 
    int y; 
}; 
  
int main(void) 
{ 
    struct point_s A; 
  
    A.x = 1; 
    A.y = 2; 
  
    printf("A = (%d, %d)\n", A.x, A.y); 
  
    return 0; 
}
Une union est composée de différents champs qui se superposent ou, en d'autres termes, qui utilisent le même emplacement mémoire. Il n'est donc tout simplement pas possible d'utiliser tous ces champs en même temps.

Code c : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h> 
  
union duo_u { 
    int n; 
    double x; 
}; 
  
int main(void) 
{ 
    union duo_u d; 
  
    d.n = 1; 
  
    /* Nous avons sélectionné le champ n, nous devons utiliser ce champ     */ 
    /* et uniquement ce champ jusqu'à ce que nous n'en aurions plus besoin. */ 
  
    printf("d.n = %d\n", d.n); 
  
    d.n = 2; 
  
    printf("d.n = %d\n", d.n); 
  
    d.x = 3.0; 
  
    /* Nous avons sélectionné le champ x, nous devons utiliser ce champ     */ 
    /* et uniquement ce champ jusqu'à ce que nous n'en aurions plus besoin. */ 
  
    printf("d.x = %f\n", d.x); 
  
    d.x = 4.0; 
  
    printf("d.x = %f\n", d.x); 
  
    return 0; 
}
Comme nous pouvons le constater, les unions sont donc très pratiques pour économiser de la mémoire.

Mis à jour le 27 juillet 2008 gl LFE Melem

À cause des contraintes d'alignement imposées par certains processeurs. Certains processeurs imposent en effet qu'une donnée de type X doit se trouver en mémoire à une adresse respectant certains critères. Les champs d'une structure ne sont donc pas forcément adjacents !

Mis à jour le 2 mars 2003 Bob gl

En utilisant l'opérateur = ou la fonction memcpy (string.h).

Code c : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h> 
#include <string.h> 
  
struct personne_s { 
    char nom[21]; 
    int age; 
}; 
  
int main(void) 
{ 
    struct personne_s A, B, C; 
  
    strcpy(A.nom, "A"); 
    A.age = 26; 
  
    B = A; 
    memcpy(&C, &A, sizeof(C)); 
  
    printf("A.nom = %s\n", A.nom); 
    printf("A.age = %d\n", A.age); 
  
    printf("B.nom = %s\n", B.nom); 
    printf("B.age = %d\n", B.age); 
  
    printf("C.nom = %s\n", C.nom); 
    printf("C.age = %d\n", C.age); 
  
    return 0; 
}

Mis à jour le 23 mars 2009 Melem

L'opérateur == n'étant pas défini pour les structures, il faut faire une comparaison champ par champ. On ne peut pas non plus utiliser la fonction memcmp car les champs d'une structure ne sont pas forcément adjacents comme les éléments d'un tableau par exemple. Les espaces créés entre les différents champs lorsqu'ils existent peuvent contenir des valeurs différentes même pour deux structures identiques or memcmp ne fait qu'une comparaison bit par bit des contenus des mémoires comparées. Elle ne peut donc être utilisée pour comparer des structures.

Mis à jour le 23 mars 2009 Melem

Pourquoi la taille d'une structure n'est pas forcément égale à la somme des tailles de ses champs ?

unsigned int i : <n>; est une déclaration qui ne peut figurer que dans la définition d'une structure et qui permet de créer un champ, ici i, dont la taille est spécifiée en bits. i est ce qu'on appelle en langage C un champ de bits.

Code C : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct test_s 
{ 
    unsigned int i : 1; 
    unsigned int j : 2; 
}; 
  
int main(void) 
{ 
    struct test_s s; 
  
    s.i = 0; /* À la fin de l'instruction, on aura s.i = 0 en binaire soit 0 en décimal. */ 
    s.i++; /* À la fin de l'instruction, on aura s.i = 1 en binaire soit 1 en décimal. */ 
    s.i++; /* À la fin de l'instruction, on aura s.i = 0 en binaire soit 0 en décimal. */ 
  
    s.j = 0; /* À la fin de l'instruction, on aura s.j = 00 en binaire soit 0 en décimal. */ 
    s.j++; /* À la fin de l'instruction, on aura s.j = 01 en binaire soit 1 en décimal. */ 
    s.j++; /* À la fin de l'instruction, on aura s.j = 10 en binaire soit 2 en décimal. */ 
    s.j++; /* À la fin de l'instruction, on aura s.j = 11 en binaire soit 3 en décimal. */ 
    s.j++; /* À la fin de l'instruction, on aura s.j = 00 en binaire soit 0 en décimal. */ 
  
    return 0; 
}
Chaque implémentation doit au moins supporter les types int et unsigned int dans la déclaration d'un champ de bits. Une implémentation particulière peut toutefois supporter également d'autres types.

Mis à jour le 15 mai 2003 nyal

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2016 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Contacter le responsable de la rubrique C