<?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-cours4</id>
	<title>INFO517-cours4 - 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-cours4"/>
	<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO517-cours4&amp;action=history"/>
	<updated>2026-05-21T05:37:46Z</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-cours4&amp;diff=3068&amp;oldid=prev</id>
		<title>Lvaux le 18 novembre 2008 à 22:55</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=INFO517-cours4&amp;diff=3068&amp;oldid=prev"/>
		<updated>2008-11-18T22:55:56Z</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:55&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 4 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;Représentation de la mémoire: pointeurs. &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;Représentation de la mémoire: pointeurs. &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-cours4&amp;diff=2863&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-cours4&amp;diff=2863&amp;oldid=prev"/>
		<updated>2008-11-10T17:30:31Z</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;Représentation de la mémoire: pointeurs. &lt;br /&gt;
&lt;br /&gt;
== Les exemples vus en cours ==&lt;br /&gt;
&lt;br /&gt;
Appel par adresse: &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 inc (int *i) {&lt;br /&gt;
	++(*i) ;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
	int n = 0 ; &lt;br /&gt;
	printf(&amp;quot;%d\n&amp;quot;,n) ; &lt;br /&gt;
	inc(&amp;amp;n) ; &lt;br /&gt;
	printf(&amp;quot;%d\n&amp;quot;,n) ; &lt;br /&gt;
	return n ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rappel (tableaux):&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 inc (int t[]) {&lt;br /&gt;
	t[0]++ ;  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
	int t[] = { 0 } ; &lt;br /&gt;
	printf(&amp;quot;%d\n&amp;quot;,t[0]) ; &lt;br /&gt;
	inc(t) ; &lt;br /&gt;
	printf(&amp;quot;%d\n&amp;quot;,t[0]) ; &lt;br /&gt;
	return t[0] ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les tableaux sont des pointeurs particuliers:&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 aff (char *s) {&lt;br /&gt;
	while (*s != &amp;#039;\0&amp;#039;) {&lt;br /&gt;
		putchar(*s) ;&lt;br /&gt;
		s++ ;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
	aff(&amp;quot;bateau\n&amp;quot;) ;&lt;br /&gt;
	return 0 ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Affichage des éléments d&amp;#039;un tableau d&amp;#039;entiers&lt;br /&gt;
(c&amp;#039;est pareil):&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;
/* affiche les n premiers éléments de t */&lt;br /&gt;
void aff (int *t, int n) {&lt;br /&gt;
	putchar(&amp;#039;{&amp;#039;) ;&lt;br /&gt;
	for (;n&amp;gt;0;n--) {&lt;br /&gt;
		printf(&amp;quot;%d&amp;quot;,*t) ;&lt;br /&gt;
		if (n&amp;gt;1) &lt;br /&gt;
			putchar(&amp;#039;,&amp;#039;) ; &lt;br /&gt;
		t++ ;&lt;br /&gt;
	}&lt;br /&gt;
	putchar(&amp;#039;}&amp;#039;) ; &lt;br /&gt;
	putchar(&amp;#039;\n&amp;#039;) ; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
	int t[] = {1,7,3,4,0,-1} ;&lt;br /&gt;
	aff(t,3) ;&lt;br /&gt;
	return 0 ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Attention: rien ne contrôle le fait qu&amp;#039;on est bien dans le tableau. &lt;br /&gt;
C&amp;#039;est-à-dire que ce qui suit est un programme C valide, qui compile et s&amp;#039;exécute:&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;
/* affiche les n premiers éléments de t */&lt;br /&gt;
void aff (int *t, int n) {&lt;br /&gt;
	putchar(&amp;#039;{&amp;#039;) ;&lt;br /&gt;
	for (;n&amp;gt;0;n--) {&lt;br /&gt;
		printf(&amp;quot;%d&amp;quot;,*t) ;&lt;br /&gt;
		if (n&amp;gt;1) &lt;br /&gt;
			putchar(&amp;#039;,&amp;#039;) ; &lt;br /&gt;
		t++ ;&lt;br /&gt;
	}&lt;br /&gt;
	putchar(&amp;#039;}&amp;#039;) ; &lt;br /&gt;
	putchar(&amp;#039;\n&amp;#039;) ; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
	int t[] = {1,7,3,4,0,-1} ;&lt;br /&gt;
	aff(t,7) ; // PROBLÈME !&lt;br /&gt;
	return 0 ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
On obtient par exemple: &lt;br /&gt;
  {1,7,3,4,0,-1,-1077769696}&lt;br /&gt;
&lt;br /&gt;
Toutefois, il ne faut pas pousser le bouchon trop loin: on finit par écrire&lt;br /&gt;
dans des zones qui ne sont pas allouées en mémoire. Ce programme, bien que&lt;br /&gt;
valide en C, plante:&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;
/* affiche les n premiers éléments de t */&lt;br /&gt;
void aff (int *t, int n) {&lt;br /&gt;
	putchar(&amp;#039;{&amp;#039;) ;&lt;br /&gt;
	for (;n&amp;gt;0;n--) {&lt;br /&gt;
		printf(&amp;quot;%d&amp;quot;,*t) ;&lt;br /&gt;
		if (n&amp;gt;1) &lt;br /&gt;
			putchar(&amp;#039;,&amp;#039;) ; &lt;br /&gt;
		t++ ;&lt;br /&gt;
	}&lt;br /&gt;
	putchar(&amp;#039;}&amp;#039;) ; &lt;br /&gt;
	putchar(&amp;#039;\n&amp;#039;) ; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
	int t[] = {1,7,3,4,0,-1} ;&lt;br /&gt;
	aff(t,32000) ; // PROBLÈME !&lt;br /&gt;
	return 0 ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
C&amp;#039;est notre deuxième erreur de segmentation: on y reviendra, &lt;br /&gt;
en précisant où sont les choses en mémoire.&lt;br /&gt;
&lt;br /&gt;
On peut afficher les adresses d&amp;#039;un peu tout. Ici, par exemple, celles des&lt;br /&gt;
arguments des fonctions qui se retrouvent 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;
&lt;br /&gt;
void f (char a, char b) {&lt;br /&gt;
	printf(&amp;quot;char:\n&amp;quot;) ;&lt;br /&gt;
	printf(&amp;quot;&amp;amp;a: %u\n&amp;amp;b: %u\n&amp;quot;, &amp;amp;a,&amp;amp;b) ; &lt;br /&gt;
	printf(&amp;quot;a: %u\nb: %u\n&amp;quot;, a,b) ; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void g (int a, int b) {&lt;br /&gt;
	printf(&amp;quot;int:\n&amp;quot;) ;&lt;br /&gt;
	printf(&amp;quot;&amp;amp;a: %u\n&amp;amp;b: %u\n&amp;quot;, &amp;amp;a,&amp;amp;b) ; &lt;br /&gt;
	printf(&amp;quot;a: %u\nb: %u\n&amp;quot;, a,b) ; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void h (long double a, long double b) {&lt;br /&gt;
	printf(&amp;quot;long double:\n&amp;quot;) ;&lt;br /&gt;
	printf(&amp;quot;&amp;amp;a: %u\n&amp;amp;b: %u\n&amp;quot;, &amp;amp;a,&amp;amp;b) ; &lt;br /&gt;
	printf(&amp;quot;a: %Lf\nb: %Lf\n&amp;quot;, a,b) ; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
	f(0,1) ;&lt;br /&gt;
	g(0,1) ;&lt;br /&gt;
	h(0,1) ;&lt;br /&gt;
	return 0 ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
À l&amp;#039;exécution, on remarque que l&amp;#039;écart entre ces adresses change (et aussi, qu&amp;#039;elles ne sont pas forcément dans l&amp;#039;ordre attendu):&lt;br /&gt;
  char:&lt;br /&gt;
  &amp;amp;a: 3216755060&lt;br /&gt;
  &amp;amp;b: 3216755056&lt;br /&gt;
  a: a&lt;br /&gt;
  b: b&lt;br /&gt;
  int:&lt;br /&gt;
  &amp;amp;a: 3216755072&lt;br /&gt;
  &amp;amp;b: 3216755076&lt;br /&gt;
  a: 97&lt;br /&gt;
  b: 98&lt;br /&gt;
  long double:&lt;br /&gt;
  &amp;amp;a: 3216755072&lt;br /&gt;
  &amp;amp;b: 3216755084&lt;br /&gt;
  a: 97.000000&lt;br /&gt;
  b: 98.000000&lt;br /&gt;
En effet, les&lt;br /&gt;
types considérés ont des tailles différentes. La primitive &amp;lt;tt&amp;gt;sizeof&amp;lt;/tt&amp;gt;&lt;br /&gt;
donne (en octets) l&amp;#039;espace mémoire nécessaire pour stocker une donnée du type&lt;br /&gt;
considéré:&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 aff_taille (const char nom[], size_t taille) {&lt;br /&gt;
	printf(&amp;quot;%16s : %2u\n&amp;quot;,nom,taille) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Affiche les tailles de types à taille fixe les plus courants */&lt;br /&gt;
int main () {&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;Liste de tailles :\n&amp;quot;) ; &lt;br /&gt;
	aff_taille(&amp;quot;void&amp;quot;,sizeof(void)) ;  &lt;br /&gt;
	aff_taille(&amp;quot;char&amp;quot;,sizeof(char)) ;  &lt;br /&gt;
	aff_taille(&amp;quot;short int&amp;quot;,sizeof(short int)) ;  &lt;br /&gt;
	aff_taille(&amp;quot;int&amp;quot;,sizeof(int)) ;  &lt;br /&gt;
	aff_taille(&amp;quot;long int&amp;quot;,sizeof(long int)) ;  &lt;br /&gt;
	aff_taille(&amp;quot;float&amp;quot;,sizeof(float)) ;  &lt;br /&gt;
	aff_taille(&amp;quot;double&amp;quot;,sizeof(double)) ;  &lt;br /&gt;
	aff_taille(&amp;quot;long double&amp;quot;,sizeof(long double)) ;  &lt;br /&gt;
	aff_taille(&amp;quot;void*&amp;quot;,sizeof(void*)) ;  &lt;br /&gt;
	aff_taille(&amp;quot;int*&amp;quot;,sizeof(int*)) ;  &lt;br /&gt;
	aff_taille(&amp;quot;long double*&amp;quot;,sizeof(long double*)) ;  &lt;br /&gt;
&lt;br /&gt;
	return 0 ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sur ma machine, on obtient la sortie:&lt;br /&gt;
  Liste de tailles :&lt;br /&gt;
              void :  1&lt;br /&gt;
              char :  1&lt;br /&gt;
         short int :  2&lt;br /&gt;
               int :  4&lt;br /&gt;
          long int :  4&lt;br /&gt;
             float :  4&lt;br /&gt;
            double :  8&lt;br /&gt;
       long double : 12&lt;br /&gt;
             void* :  4&lt;br /&gt;
              int* :  4&lt;br /&gt;
      long double* :  4&lt;br /&gt;
Noter que la taille des pointeurs est toujours la même (et c&amp;#039;est celle du type &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Le type du pointeur renseigne le compilateur sur le décalage d&amp;#039;adresse à produire lors d&amp;#039;opérations arithmétiques: &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;
int main () {&lt;br /&gt;
	char *s ; &lt;br /&gt;
	int *p ;&lt;br /&gt;
	long double *q ;&lt;br /&gt;
&lt;br /&gt;
	int i ;&lt;br /&gt;
&lt;br /&gt;
	for (i=0;i&amp;lt;4;++i) {&lt;br /&gt;
		++s ; &lt;br /&gt;
		printf(&amp;quot;s+%d : %u\n&amp;quot;,i,s) ; &lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	for (i=0;i&amp;lt;4;++i) {&lt;br /&gt;
		++p ;&lt;br /&gt;
		printf(&amp;quot;p+%d : %u\n&amp;quot;,i,p) ; &lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	for (i=0;i&amp;lt;4;++i) {&lt;br /&gt;
		++q ;&lt;br /&gt;
		printf(&amp;quot;q+%d : %u\n&amp;quot;,i,q) ; &lt;br /&gt;
	}&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;
On observe que les écarts reflètent bien la taille du type annoncé (1, 4 et 12 ici):&lt;br /&gt;
  s+0 : 3086073265&lt;br /&gt;
  s+1 : 3086073266&lt;br /&gt;
  s+2 : 3086073267&lt;br /&gt;
  s+3 : 3086073268&lt;br /&gt;
  p+0 : 134513757&lt;br /&gt;
  p+1 : 134513761&lt;br /&gt;
  p+2 : 134513765&lt;br /&gt;
  p+3 : 134513769&lt;br /&gt;
  q+0 : 3216681396&lt;br /&gt;
  q+1 : 3216681408&lt;br /&gt;
  q+2 : 3216681420&lt;br /&gt;
  q+3 : 3216681432&lt;br /&gt;
&lt;br /&gt;
Revenons sur l&amp;#039;allocation des tableaux avec le code 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;
&lt;br /&gt;
#define TAILLE 1024&lt;br /&gt;
&lt;br /&gt;
int t1 [TAILLE] ; &lt;br /&gt;
int t2 [1] ; &lt;br /&gt;
int t3 [TAILLE] ; &lt;br /&gt;
int t4 [1] ; &lt;br /&gt;
&lt;br /&gt;
void aff_point (int *p) {&lt;br /&gt;
	printf(&amp;quot;%u = %x -&amp;gt; %i\n&amp;quot;,p,p,*p) ; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int * tab_nouv (int n) {&lt;br /&gt;
	int t[TAILLE] ; &lt;br /&gt;
	int i ;&lt;br /&gt;
	for (i=0; i&amp;lt;TAILLE; ++i) &lt;br /&gt;
		t[i]=n ;&lt;br /&gt;
	return t ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Affiche les adresses des tableaux statiques et de deux &amp;quot;tableaux&amp;quot; créés par&lt;br /&gt;
 * tab_nouv() */&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
	int *t5 = tab_nouv(4) ;&lt;br /&gt;
	int *t6 = tab_nouv(2) ;&lt;br /&gt;
	printf(&amp;quot;Tableaux statiques:\n&amp;quot;) ; &lt;br /&gt;
	aff_point(t1) ; &lt;br /&gt;
	aff_point(t2) ; &lt;br /&gt;
	aff_point(t3) ; &lt;br /&gt;
	aff_point(t4) ; &lt;br /&gt;
	printf(&amp;quot;Tableaux dynamiques (?):\n&amp;quot;) ; &lt;br /&gt;
	aff_point(t5) ; &lt;br /&gt;
	aff_point(t6) ; &lt;br /&gt;
	return 0 ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L&amp;#039;intention de l&amp;#039;auteur est visiblement de retourner un tableau « frais »&lt;br /&gt;
à chaque appel de &amp;lt;tt&amp;gt;tab_nouv&amp;lt;/tt&amp;gt;. C&amp;#039;est un peu raté, car la sortie de ce programme &lt;br /&gt;
ressemble à:&lt;br /&gt;
  Tableaux statiques:&lt;br /&gt;
  134522656 = 804a720 -&amp;gt; 0&lt;br /&gt;
  134518496 = 80496e0 -&amp;gt; 0&lt;br /&gt;
  134518528 = 8049700 -&amp;gt; 0&lt;br /&gt;
  134522624 = 804a700 -&amp;gt; 0&lt;br /&gt;
  Tableaux dynamiques (?):&lt;br /&gt;
  3219749988 = bfe97c64 -&amp;gt; 2&lt;br /&gt;
  3219749988 = bfe97c64 -&amp;gt; 2&lt;br /&gt;
Les adresses renvoyées par &amp;lt;tt&amp;gt;tab_nouv&amp;lt;/tt&amp;gt; sont les mêmes et le contenu est&lt;br /&gt;
écrasé. C&amp;#039;est bien normal: ces tableaux sont alloués sur la pile, puis&lt;br /&gt;
immédiatement oubliés à la sortie de la fonction.&lt;br /&gt;
&lt;br /&gt;
On souhaite donc faire de l&amp;#039;allocation dynamique: c&amp;#039;est le rôle de la fonction &lt;br /&gt;
&amp;lt;tt&amp;gt;void *malloc(size_t taille)&amp;lt;/tt&amp;gt; qui renvoie l&amp;#039;adresse de début &lt;br /&gt;
d&amp;#039;une zone de mémoire allouée, d&amp;#039;une taille au moins égale à &amp;lt;tt&amp;gt;taille&amp;lt;/tt&amp;gt;.&lt;br /&gt;
On pourra donc réécrire:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int * tab_nouv (int n) {&lt;br /&gt;
	int *t = malloc(TAILLE*sizeof(int)) ; &lt;br /&gt;
		// la taille est donnée en octets !&lt;br /&gt;
        int i ;&lt;br /&gt;
        for (i=0; i&amp;lt;TAILLE; ++i)&lt;br /&gt;
                t[i]=n ;&lt;br /&gt;
        return t ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
On peut vérifier que la nouvelle version fonctionne bien sur la sortie:&lt;br /&gt;
  Tableaux statiques:&lt;br /&gt;
  134522720 = 804a760 -&amp;gt; 0&lt;br /&gt;
  134518560 = 8049720 -&amp;gt; 0&lt;br /&gt;
  134518592 = 8049740 -&amp;gt; 0&lt;br /&gt;
  134522688 = 804a740 -&amp;gt; 0&lt;br /&gt;
  Tableaux dynamiques:&lt;br /&gt;
  134529032 = 804c008 -&amp;gt; 4&lt;br /&gt;
  134533136 = 804d010 -&amp;gt; 2&lt;br /&gt;
Notez que les adresses rendues par &amp;lt;tt&amp;gt;malloc&amp;lt;/tt&amp;gt; sont proches de celles des variables statiques.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Application à la lecture de lignes de longueur non bornée:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
  #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// On alloue par blocs de talle MORCEAU.&lt;br /&gt;
#define MORCEAU 1024&lt;br /&gt;
&lt;br /&gt;
/* Lit une ligne en entrée _quelle que soit sa taille_&lt;br /&gt;
 * et la stocke dans *p (p est un pointeur sur une chaîne).&lt;br /&gt;
 * Renvoie le nombre de caractère lus (-1 en cas d&amp;#039;erreur). */&lt;br /&gt;
&lt;br /&gt;
int lit_ligne (char **p) {&lt;br /&gt;
	char c ;&lt;br /&gt;
	char *s ;&lt;br /&gt;
	int pos, blocs, i ;&lt;br /&gt;
&lt;br /&gt;
	// La position courante dans la chaîne est i+MORCEAU*blocs.&lt;br /&gt;
	pos = blocs = i = 0 ;&lt;br /&gt;
&lt;br /&gt;
	// On alloue le premier morceau.&lt;br /&gt;
	s = malloc ((++blocs)*MORCEAU*sizeof(char)) ; &lt;br /&gt;
	if (s == NULL) return -1 ;&lt;br /&gt;
&lt;br /&gt;
	while ((c=getchar())!=EOF &amp;amp;&amp;amp; c!=&amp;#039;\n&amp;#039;) {&lt;br /&gt;
		s[pos] = c ; &lt;br /&gt;
		if (i==MORCEAU-1) { // on déborderait en faisant ++i &lt;br /&gt;
			if ((s=realloc(s,(++blocs)*MORCEAU*sizeof(char))) == NULL) {&lt;br /&gt;
				return -1 ; // plus de mémoire : on quitte &lt;br /&gt;
			}&lt;br /&gt;
			i=0 ;&lt;br /&gt;
		} else {&lt;br /&gt;
			++i;&lt;br /&gt;
		}&lt;br /&gt;
		++pos ; &lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// si c == &amp;#039;\n&amp;#039; il faut l&amp;#039;ajouter &lt;br /&gt;
	&lt;br /&gt;
	if (c==&amp;#039;\n&amp;#039;) {&lt;br /&gt;
		s[pos] = c ; &lt;br /&gt;
		// on pourrait déborder en ajoutant le &amp;#039;\0&amp;#039;: on gère ça&lt;br /&gt;
		if (i==MORCEAU-1) { &lt;br /&gt;
			if ((s=realloc(s,(pos+1)*sizeof(char))) == NULL) &lt;br /&gt;
				return -1 ; // plus de mémoire : on quitte &lt;br /&gt;
		}&lt;br /&gt;
		++pos ; &lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	s[pos]=&amp;#039;\0&amp;#039; ;&lt;br /&gt;
	*p=s ;&lt;br /&gt;
	return pos ;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Lit des lignes sur l&amp;#039;entrée et les affiche à l&amp;#039;envers. */ &lt;br /&gt;
int main () {&lt;br /&gt;
	char *s ; &lt;br /&gt;
	int ret ;&lt;br /&gt;
	while ((ret=lit_ligne(&amp;amp;s))&amp;gt;0) {&lt;br /&gt;
		if (s[ret-1]==&amp;#039;\n&amp;#039;)&lt;br /&gt;
			ret--;&lt;br /&gt;
		for (;ret&amp;gt;0;--ret) &lt;br /&gt;
			putchar(s[ret-1]) ;&lt;br /&gt;
		putchar(&amp;#039;\n&amp;#039;) ;&lt;br /&gt;
		free(s) ;&lt;br /&gt;
	}&lt;br /&gt;
	return ret ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La fonction &amp;lt;tt&amp;gt;void *realloc(void *p, size_t taille)&amp;lt;/tt&amp;gt; demande de changer&lt;br /&gt;
la taille de la zone allouée par &amp;lt;tt&amp;gt;malloc&amp;lt;/tt&amp;gt; pointée par &amp;lt;tt&amp;gt;p&amp;lt;/tt&amp;gt;, en en&lt;br /&gt;
conservant le contenu.&lt;br /&gt;
&lt;br /&gt;
La fonction &amp;lt;tt&amp;gt;void free(void *p)&amp;lt;/tt&amp;gt; libère la zone de mémoire allouée par &lt;br /&gt;
&amp;lt;tt&amp;gt;malloc&amp;lt;/tt&amp;gt; ou &amp;lt;tt&amp;gt;realloc&amp;lt;/tt&amp;gt; et la rend au système: on a fini de s&amp;#039;en servir.&lt;br /&gt;
C&amp;#039;est essentiel, car on alloue autant de zones que de lignes lues: sans l&amp;#039;appel à &amp;lt;tt&amp;gt;free&amp;lt;/tt&amp;gt; en fin de boucle, &lt;br /&gt;
on conserverait en mémoire toutes les lignes alors que seule la dernière nous intéresse.&lt;/div&gt;</summary>
		<author><name>Lvaux</name></author>
	</entry>
</feed>