<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?action=history&amp;feed=atom&amp;title=INFO517-cours5</id>
	<title>INFO517-cours5 - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?action=history&amp;feed=atom&amp;title=INFO517-cours5"/>
	<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO517-cours5&amp;action=history"/>
	<updated>2026-05-21T05:38:11Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO517-cours5&amp;diff=3069&amp;oldid=prev</id>
		<title>Lvaux le 18 novembre 2008 à 22:56</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO517-cours5&amp;diff=3069&amp;oldid=prev"/>
		<updated>2008-11-18T22:56:24Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;fr&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Version précédente&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version du 18 novembre 2008 à 22:56&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Ligne 1 :&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Ligne 1 :&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Séance 5 du Cours-TD de [[INFO517|Programmation C]].&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Modèle mémoire: pile, tas, segment de code, allocation dynamique.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Modèle mémoire: pile, tas, segment de code, allocation dynamique.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Lvaux</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO517-cours5&amp;diff=2864&amp;oldid=prev</id>
		<title>Lvaux : Création de la page</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO517-cours5&amp;diff=2864&amp;oldid=prev"/>
		<updated>2008-11-10T17:30:54Z</updated>

		<summary type="html">&lt;p&gt;Création de la page&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Modèle mémoire: pile, tas, segment de code, allocation dynamique.&lt;br /&gt;
&lt;br /&gt;
== Les exemples vus en cours ==&lt;br /&gt;
&lt;br /&gt;
Le code suivant affiche la chaîne &amp;lt;tt&amp;gt;abcdef&amp;lt;/tt&amp;gt; en minuscules puis en majuscules:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void maj (char s[]) {&lt;br /&gt;
	int i ; &lt;br /&gt;
	for (i=0 ; s[i]!=&amp;#039;\0&amp;#039; ; i++) {&lt;br /&gt;
		char c = s[i] ; &lt;br /&gt;
		if (c&amp;gt;=&amp;#039;a&amp;#039; &amp;amp;&amp;amp; c&amp;lt;=&amp;#039;z&amp;#039;) &lt;br /&gt;
			s[i] = c+&amp;#039;A&amp;#039;-&amp;#039;a&amp;#039; ; &lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
	char s[] = &amp;quot;abcdef&amp;quot; ;  /* tableau = pointeur ? */&lt;br /&gt;
	&lt;br /&gt;
	puts(s) ; &lt;br /&gt;
	maj(s) ; &lt;br /&gt;
	puts(s) ; &lt;br /&gt;
	return 0 ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si on change la déclaration de &amp;lt;tt&amp;gt;s&amp;lt;/tt&amp;gt; en &lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
	char s* = &amp;quot;abcdef&amp;quot; ;  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
on obtient une erreur de segmentation. Pourquoi ? &lt;br /&gt;
&lt;br /&gt;
Les tableaux ne sont pas des variables comme les autres: &lt;br /&gt;
un tableau &amp;lt;tt&amp;gt;t&amp;lt;/tt&amp;gt; doit être considéré comme un alias pour&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;amp;t[0]&amp;lt;/tt&amp;gt;, qui n&amp;#039;est pas une valeur gauche (quelque chose qui va à&lt;br /&gt;
gauche du signe &amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;): c&amp;#039;est de la même nature que &lt;br /&gt;
&amp;lt;tt&amp;gt;n+1&amp;lt;/tt&amp;gt; par exemple.&lt;br /&gt;
Lors de la déclaration d&amp;#039;un tableau, &lt;br /&gt;
son contenu (dont la taille est connue à la compilation)&lt;br /&gt;
est alloué sur la pile. Par contraste, un pointeur est une variable entière &lt;br /&gt;
qui contient une adresse. Lors de la déclaration &lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
	char s* = &amp;quot;abcdef&amp;quot; ;  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
le tableau constant &amp;lt;tt&amp;gt;&amp;quot;abcdef&amp;quot;&amp;lt;/tt&amp;gt; est alloué dans le segment &lt;br /&gt;
de code &amp;#039;&amp;#039;en lecture seule&amp;#039;&amp;#039; et &amp;lt;tt&amp;gt;s&amp;lt;/tt&amp;gt; pointe sur le premier caractère:&lt;br /&gt;
c&amp;#039;est très différent. &lt;br /&gt;
&lt;br /&gt;
On va mettre en évidence ce phénomène dans la suite&lt;br /&gt;
en précisant l&amp;#039;emplacement mémoire des divers éléments d&amp;#039;un programme.&lt;br /&gt;
&lt;br /&gt;
Voilà d&amp;#039;abord une petite bibliothèque pour afficher des adresses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;mem.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef MEM_H &lt;br /&gt;
#define MEM_H &lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void mem_indent (int n) ;&lt;br /&gt;
&lt;br /&gt;
/********** Affichage de pointeurs **********/&lt;br /&gt;
&lt;br /&gt;
void mem_addr (void *p) ;&lt;br /&gt;
void mem_addr_ptr (void **p) ;&lt;br /&gt;
void mem_addr_ch (char **p) ;&lt;br /&gt;
void mem_ch (char *p) ;&lt;br /&gt;
void mem_addr_int (int *p) ;&lt;br /&gt;
&lt;br /&gt;
/********** Affichage de la pile **********/&lt;br /&gt;
&lt;br /&gt;
int * mem_debut_pile ;&lt;br /&gt;
void mem_aff_pile (int *haut) ;&lt;br /&gt;
void mem_aff_pile_chars (int *haut) ;&lt;br /&gt;
#endif &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;mem.c&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;
#include &amp;quot;mem.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/********** Fonctions utiles **********/&lt;br /&gt;
&lt;br /&gt;
/* Affiche un caractère s&amp;#039;il est directement imprimable, &lt;br /&gt;
 * un code standard s&amp;#039;il est connu et le code octal sinon. */&lt;br /&gt;
void mem_print_char (char c) {&lt;br /&gt;
	if ((c&amp;gt;=&amp;#039;a&amp;#039; &amp;amp;&amp;amp; c&amp;lt;=&amp;#039;z&amp;#039;) || (c&amp;gt;=&amp;#039;A&amp;#039; &amp;amp;&amp;amp; c&amp;lt;=&amp;#039;Z&amp;#039;) || (c&amp;gt;=&amp;#039;0&amp;#039; &amp;amp;&amp;amp; c&amp;lt;=&amp;#039;9&amp;#039;))&lt;br /&gt;
		printf(&amp;quot;%4c&amp;quot;,c) ;&lt;br /&gt;
	else switch (c) {&lt;br /&gt;
			case &amp;#039;.&amp;#039;: &lt;br /&gt;
			case &amp;#039;,&amp;#039;: &lt;br /&gt;
			case &amp;#039;;&amp;#039;: &lt;br /&gt;
			case &amp;#039;!&amp;#039;: &lt;br /&gt;
			case &amp;#039;?&amp;#039;: &lt;br /&gt;
			case &amp;#039;:&amp;#039;: &lt;br /&gt;
				printf(&amp;quot;%4c&amp;quot;,c) ;&lt;br /&gt;
				break ; &lt;br /&gt;
			case &amp;#039; &amp;#039;: &lt;br /&gt;
				printf(&amp;quot; &amp;#039; &amp;#039;&amp;quot;) ;&lt;br /&gt;
				break ;&lt;br /&gt;
			case &amp;#039;\n&amp;#039;: &lt;br /&gt;
				printf(&amp;quot;  \\n&amp;quot;) ;&lt;br /&gt;
				break ;&lt;br /&gt;
			case &amp;#039;\t&amp;#039;: &lt;br /&gt;
				printf(&amp;quot;  \\t&amp;quot;) ;&lt;br /&gt;
				break ;&lt;br /&gt;
			default: &lt;br /&gt;
				printf(&amp;quot;\\%03o&amp;quot;,(unsigned char)c) ;&lt;br /&gt;
		}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Indente avec `n&amp;#039; tabulations */&lt;br /&gt;
void mem_indent (int n) {&lt;br /&gt;
	int i ;&lt;br /&gt;
	for (i=1;i&amp;lt;=n;i++)&lt;br /&gt;
		putchar(&amp;#039;\t&amp;#039;) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/********** Affichage de pointeurs **********/&lt;br /&gt;
&lt;br /&gt;
/* Affiche la valeur d&amp;#039;un pointeur (c&amp;#039;est-à-dire l&amp;#039;adresse de la case vers&lt;br /&gt;
 * laquelle il pointe. */&lt;br /&gt;
void mem_addr (void *p) {&lt;br /&gt;
	printf(&amp;quot;%10u == %8x\n&amp;quot;,&lt;br /&gt;
			(unsigned int) p, &lt;br /&gt;
			(unsigned int) p) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Affiche l&amp;#039;adresse et la valeur d&amp;#039;un pointeur. */&lt;br /&gt;
void mem_addr_ptr (void **p) {&lt;br /&gt;
	printf(&amp;quot;%10u == %8x -&amp;gt; %10u == %8x\n&amp;quot;,&lt;br /&gt;
			(unsigned int) p, &lt;br /&gt;
			(unsigned int) p, &lt;br /&gt;
			(unsigned int) *p, &lt;br /&gt;
			(unsigned int) *p);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Affiche l&amp;#039;adresse et la valeur d&amp;#039;un pointeur sur `char&amp;#039;, &lt;br /&gt;
 * puis l&amp;#039;affiche comme une chaîne. */&lt;br /&gt;
void mem_addr_ch (char **p) {&lt;br /&gt;
	printf(&amp;quot;%10u == %8x -&amp;gt; %10u == %8x -&amp;gt; %s\n&amp;quot;,&lt;br /&gt;
			(unsigned int) p, &lt;br /&gt;
			(unsigned int) p, &lt;br /&gt;
			(unsigned int) *p, &lt;br /&gt;
			(unsigned int) *p, &lt;br /&gt;
			*p) ; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Affiche la valeur d&amp;#039;un pointeur sur `char&amp;#039;, &lt;br /&gt;
 * puis l&amp;#039;affiche comme une chaîne.  */&lt;br /&gt;
void mem_ch (char *p) {&lt;br /&gt;
	printf(&amp;quot;%10u == %8x -&amp;gt; %s\n&amp;quot;,&lt;br /&gt;
			(unsigned int) p, &lt;br /&gt;
			(unsigned int) p, &lt;br /&gt;
			p) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Affiche l&amp;#039;adresse et la valeur d&amp;#039;un `int&amp;#039; */&lt;br /&gt;
void mem_addr_int (int *p) {&lt;br /&gt;
	printf(&amp;quot;%10u == %8x -&amp;gt; %11d\n&amp;quot;,&lt;br /&gt;
			(unsigned int) p,&lt;br /&gt;
			(unsigned int) p,&lt;br /&gt;
			*p) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Affiche l&amp;#039;adresse et la valeur d&amp;#039;un `int&amp;#039;, &lt;br /&gt;
 * avec les conversions non-signée et hexa. */&lt;br /&gt;
void mem_addr_ints (int *p) {&lt;br /&gt;
	printf(&amp;quot;%10u == %8x -&amp;gt; %11d == %10u == %8x\n&amp;quot;,&lt;br /&gt;
			(unsigned int) p,&lt;br /&gt;
			(unsigned int) p,&lt;br /&gt;
			*p, &lt;br /&gt;
			(unsigned int) *p,&lt;br /&gt;
			(unsigned int) *p) ; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Variante de la précédente avec la conversion en caractères. */&lt;br /&gt;
void mem_addr_chars (int *p) {&lt;br /&gt;
	char *s ;&lt;br /&gt;
	int i ;&lt;br /&gt;
	printf(&amp;quot;%10u == %8x -&amp;gt; %11d == %8x == {&amp;quot;,&lt;br /&gt;
			(unsigned int) p,&lt;br /&gt;
			(unsigned int) p,&lt;br /&gt;
			*p, &lt;br /&gt;
			(unsigned int) *p) ; &lt;br /&gt;
	s=(char *)p ;&lt;br /&gt;
	mem_print_char(s[0]) ; &lt;br /&gt;
	for (i=1;i&amp;lt;sizeof(int);++i) {&lt;br /&gt;
		printf(&amp;quot;,&amp;quot;);&lt;br /&gt;
		mem_print_char(s[i]) ;&lt;br /&gt;
	}&lt;br /&gt;
	printf(&amp;quot;}\n&amp;quot;) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/********** Affichage de la pile **********/&lt;br /&gt;
&lt;br /&gt;
/* Le pointeur mem_debut_pile doit être initialisé à l&amp;#039;adresse d&amp;#039;une variable&lt;br /&gt;
 * de pile */&lt;br /&gt;
&lt;br /&gt;
void mem_aff_pile (int *haut) {&lt;br /&gt;
	int *p ; &lt;br /&gt;
	for (p=haut ; p&amp;lt;= mem_debut_pile ; p++) &lt;br /&gt;
		mem_addr_ints(p) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void mem_aff_pile_chars (int *haut) {&lt;br /&gt;
	int *p ; &lt;br /&gt;
	for (p=haut ; p&amp;lt;= mem_debut_pile ; p++) &lt;br /&gt;
		mem_addr_chars(p) ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le programme suivant met en évidence l&amp;#039;allocation des chaînes constantes dans&lt;br /&gt;
le segment de code, des tableaux locaux dans la pile, et l&amp;#039;allocation dynamique dans le tas. &lt;br /&gt;
Le code a les adresses les plus basses. Le tas a des adresses petites et croissantes.&lt;br /&gt;
La pile a des adresses grandes et décroissantes.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;quot;mem.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define TAILLE 40&lt;br /&gt;
#define REC 5 &lt;br /&gt;
&lt;br /&gt;
char tab_ext [] = &amp;quot;tableau externe&amp;quot;; &lt;br /&gt;
char *ptr_ext = &amp;quot;pointeur externe&amp;quot;; &lt;br /&gt;
&lt;br /&gt;
void f (int n) {&lt;br /&gt;
	char tab_f [] = &amp;quot;f: tableau&amp;quot;;&lt;br /&gt;
	char *ptr_f = &amp;quot;f: pointeur&amp;quot;; &lt;br /&gt;
	char *ptr_all_f = malloc(TAILLE) ;&lt;br /&gt;
	snprintf(ptr_all_f,TAILLE,&amp;quot;f: pointeur alloué %d&amp;quot;, n) ;&lt;br /&gt;
&lt;br /&gt;
	if (n&amp;lt;REC) {&lt;br /&gt;
		mem_indent(n), mem_addr_int(&amp;amp;n) ;&lt;br /&gt;
		mem_indent(n), mem_ch(tab_f) ;&lt;br /&gt;
		mem_indent(n), mem_addr_ch(&amp;amp;ptr_f) ;&lt;br /&gt;
		mem_indent(n), mem_addr_ch(&amp;amp;ptr_all_f) ;&lt;br /&gt;
		f(n+1) ;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
	char tab_main [] = &amp;quot;main: tableau&amp;quot;;&lt;br /&gt;
	char *ptr_main = &amp;quot;main: pointeur&amp;quot;; &lt;br /&gt;
	char *ptr_all_main = malloc(TAILLE) ;&lt;br /&gt;
	snprintf(ptr_all_main,TAILLE,&amp;quot;main: pointeur alloué&amp;quot;) ;&lt;br /&gt;
	&lt;br /&gt;
	mem_ch(tab_ext) ;&lt;br /&gt;
	mem_addr_ch(&amp;amp;ptr_ext) ;&lt;br /&gt;
	mem_ch(tab_main) ;&lt;br /&gt;
	mem_addr_ch(&amp;amp;ptr_main) ;&lt;br /&gt;
	mem_addr_ch(&amp;amp;ptr_all_main) ;&lt;br /&gt;
&lt;br /&gt;
	f(0) ;&lt;br /&gt;
	return 0 ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
À l&amp;#039;exécution du programme suivant, on remarque que les adresses de la pile &lt;br /&gt;
décroissent plus vite que ce qu&amp;#039;on aurait en n&amp;#039;empilant que les arguments.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;quot;mem.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define REC 8&lt;br /&gt;
&lt;br /&gt;
void g (int n) ;&lt;br /&gt;
&lt;br /&gt;
void f (int n) {&lt;br /&gt;
	if (n&amp;lt;REC) {&lt;br /&gt;
		mem_addr_int(&amp;amp;n) ;&lt;br /&gt;
		g(n) ;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void g (int n) {&lt;br /&gt;
	if (n&amp;lt;REC) {&lt;br /&gt;
		mem_addr_int(&amp;amp;n) ;&lt;br /&gt;
		f(n+1) ;&lt;br /&gt;
	} &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
	int n = 0 ;&lt;br /&gt;
	mem_addr_int(&amp;amp;n) ;&lt;br /&gt;
	f(1) ;&lt;br /&gt;
&lt;br /&gt;
	return 0 ;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
C&amp;#039;est donc qu&amp;#039;il y a autre chose sur la pile. &lt;br /&gt;
&lt;br /&gt;
Le programme suivant affiche l&amp;#039;intégralité de la pile:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;quot;mem.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define REC 8&lt;br /&gt;
&lt;br /&gt;
void g (int n) ;&lt;br /&gt;
&lt;br /&gt;
void f (int n) {&lt;br /&gt;
	if (n&amp;lt;REC) {&lt;br /&gt;
		mem_addr_int(&amp;amp;n) ; &lt;br /&gt;
		g(n) ;&lt;br /&gt;
	} else {&lt;br /&gt;
		printf(&amp;quot;Affichage de la pile :\n&amp;quot;) ;&lt;br /&gt;
		mem_aff_pile(&amp;amp;n) ;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void g (int n) {&lt;br /&gt;
	if (n&amp;lt;REC) {&lt;br /&gt;
		mem_addr_int(&amp;amp;n) ;&lt;br /&gt;
		f(n+1) ;&lt;br /&gt;
	} &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
	int n = 0 ;&lt;br /&gt;
	mem_debut_pile = &amp;amp;n ;&lt;br /&gt;
&lt;br /&gt;
	mem_addr_int(&amp;amp;n) ;&lt;br /&gt;
	f(1) ;&lt;br /&gt;
	return 0 ;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
On remarque la pile contient des pointeurs vers des emplacements dans le segment de code.&lt;br /&gt;
Il s&amp;#039;agit en fait d&amp;#039;adresses de retour vers le code de &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; et &amp;lt;tt&amp;gt;g&amp;lt;/tt&amp;gt;,&lt;br /&gt;
comme mis en évidence par l&amp;#039;exécution du programme suivant: &lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;quot;mem.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define REC 8&lt;br /&gt;
&lt;br /&gt;
void g (int n) ;&lt;br /&gt;
&lt;br /&gt;
void f (int n) {&lt;br /&gt;
	if (n&amp;lt;REC) {&lt;br /&gt;
		g(n) ;&lt;br /&gt;
	} else {&lt;br /&gt;
		printf(&amp;quot;Affichage de la pile :\n&amp;quot;) ;&lt;br /&gt;
		mem_aff_pile(&amp;amp;n) ;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void g (int n) {&lt;br /&gt;
	if (n&amp;lt;REC) {&lt;br /&gt;
		f(n+1) ;&lt;br /&gt;
	} &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
	int n = 0 ;&lt;br /&gt;
	mem_debut_pile = &amp;amp;n ;&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;Adresse de f : &amp;quot;), mem_addr((void *)f) ;&lt;br /&gt;
	printf(&amp;quot;Adresse de g : &amp;quot;), mem_addr((void *)g) ;&lt;br /&gt;
	f(1) ;&lt;br /&gt;
	return 0 ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
À noter que les noms de fonctions peuvent être considérés comme des pointeurs&lt;br /&gt;
dans le segment de code. Les adresses de retour mises en évidence dans la pile &lt;br /&gt;
correspondent à des adresses dans le code de &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; et &amp;lt;tt&amp;gt;g&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On revient sur le deuxième exemple en affichant la pile, et en convertissant les &lt;br /&gt;
entiers en blocs de caractères: on retrouve les tableaux de caractères alloués sur la pile.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;quot;mem.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define TAILLE 40&lt;br /&gt;
#define REC 5 &lt;br /&gt;
&lt;br /&gt;
char tab_ext [] = &amp;quot;tableau externe&amp;quot;; &lt;br /&gt;
char *ptr_ext = &amp;quot;pointeur externe&amp;quot;; &lt;br /&gt;
&lt;br /&gt;
void f (int n) {&lt;br /&gt;
	char tab_f [] = &amp;quot;f: tableau&amp;quot;;&lt;br /&gt;
	char *ptr_f = &amp;quot;f: pointeur&amp;quot;; &lt;br /&gt;
	char *ptr_all_f = malloc(TAILLE) ;&lt;br /&gt;
	snprintf(ptr_all_f,TAILLE,&amp;quot;f: pointeur alloué %d&amp;quot;, n) ;&lt;br /&gt;
&lt;br /&gt;
	if (n&amp;lt;REC) {&lt;br /&gt;
		mem_indent(n), mem_addr_int(&amp;amp;n) ;&lt;br /&gt;
		mem_indent(n), mem_ch(tab_f) ;&lt;br /&gt;
		mem_indent(n), mem_addr_ch(&amp;amp;ptr_f) ;&lt;br /&gt;
		mem_indent(n), mem_addr_ch(&amp;amp;ptr_all_f) ;&lt;br /&gt;
		f(n+1) ;&lt;br /&gt;
	} else mem_aff_pile_chars(&amp;amp;n) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
	int n = 0 ;&lt;br /&gt;
	char tab_main [] = &amp;quot;main: tableau&amp;quot;;&lt;br /&gt;
	char *ptr_main = &amp;quot;main: pointeur&amp;quot;; &lt;br /&gt;
	char *ptr_all_main = malloc(TAILLE) ;&lt;br /&gt;
	snprintf(ptr_all_main,TAILLE,&amp;quot;main: pointeur alloué&amp;quot;) ;&lt;br /&gt;
	&lt;br /&gt;
	mem_ch(tab_ext) ;&lt;br /&gt;
	mem_addr_ch(&amp;amp;ptr_ext) ;&lt;br /&gt;
	mem_ch(tab_main) ;&lt;br /&gt;
	mem_addr_ch(&amp;amp;ptr_main) ;&lt;br /&gt;
	mem_addr_ch(&amp;amp;ptr_all_main) ;&lt;br /&gt;
&lt;br /&gt;
	mem_debut_pile = &amp;amp;n ;&lt;br /&gt;
	f(0) ;&lt;br /&gt;
&lt;br /&gt;
	return 0 ;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lvaux</name></author>
	</entry>
</feed>