Introduction au C

Le logo du C
SommaireTravailler avec la mémoire

Exercices

1 - Comprendre la pile

Pouvez-vous deviner ce que ce programme affiche ? Pourquoi ?

#include <stdio.h>

void a() {
    int x = 19;
}

void b() {
    int y;
    printf("y vaut %d\n", y);
}

int main() {
    a();
    b();

    return 0;
}

Si vous n'arrivez pas à répondre, n'hésitez pas à le compiler et à le lancer pour avoir une idée de ce qui se passe. Faites un schéma de la pile au cours du programme, et rappelez-vous que les processeurs évitent un maximum d'opérations inutiles.

2 - Jouer avec les pointeurs

Écrivez un programme qui crée une variable x avec une valeur quelconque (utilisez un type simple comme int ou char pour éviter de complexifier l'exercice), avec la valeur que vous voulez. Affichez l'adresse mémoire de cette variable (avec un pointeur, printf et un peu d'astuce).

Ensuite, demandez un nombre au clavier et interprétez-le comme une adresse dans la mémoire (pendant vos tests ré-rentrez l'adresse affichée juste avant). Créez un pointeur vers cette adresse, modifier la valeur à cette adresse, et affichez x.

Normalement x devrait avoir changé, et vous ne devriez pas avoir d'erreur de segmentation.

Si vous avez des soucis, assurez vous de stocker les nombres qui correspondent à des adresses mémoire sur des int si vous avez une machine 32 bits, et sur des long si vous avez une machine 64 bits (ce qui est le plus probable, mais si vous ne savez pas, essayez les deux).

Je précise que faire ce genre de choses sert seulement à comprendre le fonctionnement des pointeurs, il ne faut jamais faire ça dans la vraie vie (laisser l'utilisateurice écrire des données là où iel a envie dans la mémoire du programme peut être très dangeureux).

Proposition de correction

Mon ordinateur est en 64 bits, mais si vous avez du 32 bits, remplacez les long par des int et les %lx par des %x.

#include <stdio.h>

int main() {
    // On crée la variable x
    int x = 19;
    // On crée un pointeur vers x
    int *pointeur_sur_x = &x;

    // On affiche l'adresse en héxadécimal avec %x.
    // L'astuce est que le pointeur est juste un nombre
    // qui est l'adresse en mémoire de x.
    // Si on l'affiche avec %lx, sans le déréférencer, on vera cette adresse.
    printf("Adresse de x = %lx\n", pointeur_sur_x);

    // On va maintenant lire une adresse entrée au clavier
    long adresse = 0;
    scanf("%lx", &adresse);
    int *nouveau_pointeur = adresse;

    // On modifie la mémoire à l'adresse lue
    *nouveau_pointeur = 38;

    // On affiche x
    printf("x vaut maintenant %d\n", x);

    return 0;
}