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.