Compiler et analyser le code suivant
Exécutez le programme avec différentes valeurs numériques. Que se passe-t-il quand vous lancez par exemple ./main 0
, ./main 1
ou ./main 2
?
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int a = 5000; int b = 23; int c = {1}; int d = {2}; printf("Avant : a = %d, b = %d, c = %d, d = %d\n", a, b, c, d); int index = atoi(argv); c[index] = 42; printf("Après : a = %d, b = %d, c = %d, d = %d\n", a, b, c, d); return 0; }
Questions :
- Quelles sont vos observations sur les données modifiées ?
- Ces données sont-elles dans la stack ou la heap ?
Compiler et analyser le code suivant (Partie 2)
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int a = 5000; int b = 23; int c = {1}; int d = {2}; printf("Avant : a = %d, b = %d, c = %d, d = %d\n", a, b, c, d); *((&b) + 1) = 80; // Quelle variable est impactée ? *((&b) - 1) = 42; // Quelle variable est impactée ? printf("Après : a = %d, b = %d, c = %d, d = %d\n", a, b, c, d); return 0; }
Questions :
- Que fait le code suivant :
&b
? - Que fait le code suivant :
(&b) + 1
? - Que fait le code suivant :
*((&b) + 1)
? - En déduire ce qui se passe en mémoire. Faites une représentation de la stack.
Conseil : Pour comprendre le comportement, observez l'ordre des variables dans la stack et l'arithmétique des pointeurs.