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 :

  1. Quelles sont vos observations sur les données modifiées ?
  2. 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 :

  1. Que fait le code suivant : &b ?
  2. Que fait le code suivant : (&b) + 1 ?
  3. Que fait le code suivant : *((&b) + 1) ?
  4. 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.