Bonjour,
soit les 3 codes suivant:
[POINTEUR]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include <stdio.h>
#include <stdlib.h>
int main (int argc, char* argv[]) {
int x = 21;
int *p;
printf("valeur de l'adresse de x: %p \n", &x);
printf("pointeur de p non initialise: %p \n", p);
printf("valeur de *p non initialise: %d \n", *p);
printf("valeur de &p : %p \n\n", &p);
return 0;
} |
STRUCT
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include <stdio.h>
#include <stdlib.h>
typedef struct {
int v1;
int v2;
char c;
} Str;
int main (int argc, char* argv[]) {
Str ST;
ST.v1 = 3;
ST.c = 'e';
printf("valeur de v1 (initialise) %d\n", ST.v1);
printf("valeur de v2 (non initialise) %d\n", ST.v2);
printf("valeur de c (initialise) %c\n", ST.c);
return 0;
} |
[POINTEUR ET STRUCT]
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
| #include <stdio.h>
#include <stdlib.h>
struct Str{
int v1;
int v2;
char c;
} ;
int main (int argc, char* argv[]) {
/** test pointeur **/
int *p;
printf("pointeur de p non initialise: %p \n", p);
printf("valeur de *p non initialise: %d \n", *p);
printf("valeur de &p : %p \n\n", &p);
/** test struct **/
struct Str ST;
ST.v1 = 3;
ST.c = 'e';
printf("valeur de v1 (initialise) %d\n", ST.v1);
printf("valeur de v2 (non initialise) %d\n", ST.v2);
printf("valeur de c (initialise) %c\n", ST.c);
return 0;
} |
Si je compile POINTEUR avec gcc POINTEUR -o POINTEUR.exe ou gcc -Wall -Werror POINTEUR -o POINTEUR.exe, j’obtiens un exécutable, qui à l’exécution me donne:
valeur de l'adresse de x: 0x7fffdb6fc81c
pointeur de p non initialise: 0x7fffdb6fc910
valeur de *p non initialise: 1
valeur de &p : 0x7fffdb6fc810
et à chaque exécution j'ai valeur de *p non initialisée: 1
Si je compile STRUCT avec gcc STRUCT -o STRUCT.exe j’obtiens un exécutable, qui à l’exécution me donne:
valeur de v1 (initialise) 3
valeur de v2 (non initialise) 0
valeur de c (initialise) e
et à chaque exécution j'ai valeur de v2 (non initialise) 0
Si je compile POINTEUR ET STRUCT avec gcc POINTEUR_ET_STRUCT -o PES.exe j’obtiens un exécutable, qui à l’exécution me donne:
pointeur de p non initialise: (nil)
Segmentation fault (core dumped)
Si je compile POINTEUR ET STRUCT avec gcc -Wall -Werror POINTEUR_ET_STRUCT -o PES.exe je n'obtiens pas d’exécutable mais le message suivant:
PES.c: In function ‘main’:
PES.c:16:2: error: ‘p’ is used uninitialized in this function [-Werror=uninitialized]
16 | printf("pointeur de p non initialise: %p \n", p);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PES.c:28:2: error: ‘ST.v2’ is used uninitialized in this function [-Werror=uninitialized]
28 | printf("valeur de v2 (non initialise) %d\n", ST.v2);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
mes question sont les suivantes:
+ comment expliquer que la ligne 11 printf("pointeur de p non initialise: %p \n", p); du fichier POINTEUR ne déclenche pas d'erreurs ni à la compilation ni à l’exécution mais dans le fichier POINTEUR ET STRUCT cette même ligne (17) me donne, à l’exécution: Segmentation fault (core dumped)
?
+ Comment expliquer que dans les fichiers, POINTEUR ET STRUCT j’obtiens toujours les même valeurs 1 et 0 respectivement pour pointeur de p non initialise et pour et valeur de v2 (non initialise) ?
+ enfin comment expliquer qu'à la compilation avec -Wall -Werror pour le fichier POINTEUR je n'ai pas le même warning/error qu'avec la compilation du fichier POINTEUR ET STRUCT: PES.c:16:2: error: ‘p’ is used uninitialized in this function [-Werror=uninitialized]
16 | printf("pointeur de p non initialise: %p \n", p);
?
D'avance merci pour votre attention.
Partager