Bonjour,
@zephyre123 : ce que tu fais est extrêmement dangereux (en terme de comportant attendu du programme) car tu utilises un entier qui n'a pas été alloué. En lecture ça ne pose pas de problème, si tu écris dedans si.
lettre est une variable d'un octet, contenant 'A'
pc est une variable de type pointeur, contenant l'addresse de lettre. pc est déclarée comme pointant sur un char d'un octet, ce qui est effectivement le cas.
valeur_numerique est une variable de type pointeur, contenant l'addresse de lettre. valeur_numerique est déclarée comme pointant sur un int,
ce qui n'est pas le cas
Si tu affectes une valeur de type int à (*valeur_numerique), tu écrases le contenu de lettre (moyennement grave, lettre étant allouée) et tu écrases aussi le contenu des octets suivants lettre qui eux sont soit non alloué, soit alloué à une autre variable et là ça peut devenir catastrophique
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char lettre2 = 'B';
char lettre = 'A';
char *pc = &lettre;
int *valeur_numerique = (int*) pc;
printf ("Addresse de lettre2 : %p\n",&lettre2);
printf ("Contenu de lettre2 : %d\n\n",(int)lettre2);
printf("Valeur numerique de la lettre A : %d\n\n", *valeur_numerique);
printf ("Addresse de lettre : %p\n",&lettre);
printf ("Contenu de lettre : %d\n\n",(int)lettre);
printf ("Addresse de pc : %p\n",&pc);
printf ("Contenu de pc : %p\n\n",pc);
printf ("Addresse de valeur_numerique : %p\n",&valeur_numerique);
printf ("Contenu de valeur_numerique : %p\n\n",valeur_numerique);
*valeur_numerique = 0;
printf("Resultat apres *valeur_numerique = 0 : %d\n\n", *valeur_numerique);
printf ("Qu'est devenu lettre2 : %d",(int)lettre2);
return EXIT_SUCCESS;
}
Addresse de lettre2 : 0061FF1F
Contenu de lettre2 : 66
Valeur numerique de la lettre A : -15973823
Addresse de lettre : 0061FF1E
Contenu de lettre : 65
Addresse de pc : 0061FF18
Contenu de pc : 0061FF1E
Addresse de valeur_numerique : 0061FF14
Contenu de valeur_numerique : 0061FF1E
Resultat apres *valeur_numerique = 0 : 0
Qu'est devenu lettre2 : 0
------------------
(program exited with code: 0)
L'allocation de la mémoire peut varier en fonction des compilateurs. Il est parfois nécessaire de déclarer différemment lettre et lettre2 pour avoir le résultat ci-dessus, d'autant que les valeurs de pc et valeur_numerique peuvent être affectés également en fonction de où elles sont allouées.