wiki:InsiaProgCTp3

Sommaire

TP3 - Manipulation des pointeurs et gestion de la mémoire

1. La pile

Ecrire un programme pile.c qui prend en argument un entier, calcule sa factorielle et affiche le résultat. Pour cela, définissez dans votre programme cette fonction récursive:

float factorielle(float n);

Expliquez pourquoi on utilise un type float plutôt que integer.

Affichez les adresses des variables locales (y compris les paramètres des fonctions main et factorielle). Que constatez-vous ? (Valeurs à chaque exécution du programme, relation entre les adresses, etc)

Estimez la taille maximale de la pile.

2. La mémoire initialisée

Ecrivez un programme init.c qui n'effectue rien de particulier, mais déclare un tableau global d'entiers et initialise au moins son premier élément.

Compilez ce programme plusieurs fois en modifiant la taille du tableau (de un élément, puis de de 10, enfin de 1000) et observez la taille du fichier exécutable. Qu'en déduisez-vous ?

Affichez l'adresse de ce tableau global, ainsi qu'une adresse de la pile. Conclusions ?

3. Le tas

Ecrivez un programme tas.c qui alloue dynamiquement un tableau de N éléments, où N est un argument du programme.

Affichez l'adresse de cette mémoire allouée, ainsi que celle d'une variable de la pile. Lancez le programme plusieurs fois, avec des tailles variables. Qu'observez-vous ?

Demandez plus de mémoire que n'en a physiquement la machine (utilisez la commande shell free). Que se passe-t-il ?

Insérez une instruction pour que votre programme "attende" (ex: getchar()) après l'allocation de mémoire, et vérifiez que la mémoire allouée est décomptée des ressources du système d'exploitation (free, top).

Pouvez-vous établir une relation avec les adresses obtenues dans l'exercice précécent (mémoire initialisée) ?

4. Chaînes de caractère

Ecrivez un programme chaine.c qui transforme un texte passé en argument en sa version épelée (caractères séparées par des tirets). Exemple:

$ ./chaine "Un test"
U-n t-e-s-t

Vous le réaliserez à l'aide de la fonction suivante qui renvoie une chaîne de caractère allouée dynamiquement:

char* epelle(char* texte) {
  ...
}

Conseil: réalisez ce programme à l'aide de l'arithmétique des pointeurs.

Last modified 14 years ago Last modified on Nov 6, 2006, 1:31:58 PM