nom | adresse mémoire fixe | valeur modifiable |
x | 0x7fff6877a8f8 | 1 |
px | 0x7fff6877a8f0 | 0x7fff6877a8f8 |
Langage C : les pointeurs int x = 1; // Quand le compilateur rencontre cette instruction : // Il réserve une mémoire de longueur 4 (la taille d'un entier) // à l'adresse 0x7fff6877a8f8, où il écrit la valeur 1. x = 2; // Le compilateur écrit 2 dans l'adresse mémoire de x int* px = &x; // Quand le compilateur rencontre cette instruction : // Il réserve une mémoire de longueur 8 (la taille d'un pointeur) // à l'adresse 0x7fff6877a8f0, où il écrit l'adresse de x (0x7fff6877a8f8). // la variable px est un pointeur sur x : elle contient l'adresse mémoire de x // nécessaire pour modifier la valeur de x. *px = 3; // On va chercher le contenu de l'adresse mémoire de px (l'adresse de x) // dans laquelle on écrit 3 -> Entrer une nouvelle valeur de x : 4 scanf(" %d", &x); // permet de lire sur le clavier (stdin) l'entier 4 et de l'écrire dans x. -> Entrer une nouvelle valeur de x : 5 scanf(" %d", px); // permet de lire sur le clavier (stdin) l'entier 5 et de l'écrire dans x. En résumé : x=5 &x=px=0x7fff6877a8f8 x=*px=5 sizeof(int)=4 sizeof(int*)=8
Allocation dynamique de la mémoire contenu de tab[] : 10 9 8 7 6 5 4 3 2 1 avant malloc() : px=(nil) après malloc() : px = 0x5619b79696b0 = 94668454270640 contenu de px[] : 1 2 3 4 5 6 7 8 9 10 px[3]=4 *(px+3)=4 // pas de contrôle de débordement en C // on peut lire et écrire en dehors de la mémoire allouée // ce qui entraîne des erreurs mémoire // Segmentation fault (core dumped) // double free or corruption (out) Aborted (core dumped) // (les contrôles coûtent cher : ils ralentiraient l'exécution)