Bonjour,

soit les 3 codes suivant:

[POINTEUR]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.