TP3: Subtilités du C par contre-exemples

Dans cette partie du TP, nous allons vous montrer quelques comportements contre-intuitifs du C. Le but est de vous laisser essayer de réaliser des fonctions, pour vous amener à vous rendre compte que le comportement attendu n’est pas si simple à coder…

Exercice 1 – (1.: passage d’arguments, 2 : durée de vie des variables)

  1. Ecrire un programme dans lequel on échange les valeurs de deux réels déclarés dans main en utilisant une fonction echange(…), vérifier en utilisant printf.
  2. Dans cette fonction, ajouter un compteur sur le nombre d’appels, vérifier le bon fonctionnement du compteur.

Exercice 2 – (la pile)
Ecrire une fonction int * alloc(int val) qui alloue 300 entiers et les initialise à val.
On fera comme suit :

int * alloc (int val){
   int tab[300];
   ...
   return tab;
}

Elle sera utilisée dans main, comme indiqué ci-après :

int main(int argc, char* argv[]){
   int * ptr;
   ...
   ...
   ptr = alloc(7);
   ...
}

Vérifier le contenu de la zone mémoire ainsi allouée à ptr au retour de alloc en utilisant printf.

  • Est-ce-que le compilateur affiche un message particulier pour ce code (compilez avec l’option -Wall) ?Que veut dire le message du compilateur ?
  • Vérifiez que le compilateur a bien crée l’exécutable de votre programme. Que se passe-t-il quand on lance le programme après compilation ? Est-ce-que le programme affiche le contenu du tableau ? Pourquoi (pas) ?

Le compilateur nous a averti que quelque chose n’était pas 100% correct dans notre code — et visiblement il avait raison le programme plante. On peut donc se poser la question si le compilateur est en mesure de toujours nous avertir de se type d’erreur. Pour répondre à cette question nous allons modifier le code de la fonction alloc. Au lieu de retourner la valeur de tab directement nous allons faire une copie dans une variable locale. Rajoutez donc une nouvelle variable dans le code et mettez l’adresse de tab dans cette variable (attention de bien choisir le type de la  variable).

  • Vérifiez que le compilateur n’affiche plus de message en compilant le code. Pourquoi ?
  • Vérifiez que le programme s’exécute « normalement » (sans se planter). Les valeurs du tableau sont-elles toutes correctes ? Pourquoi (pas) ? On ne vous demande pas de corriger l’erreur.

Fin du TP3