Conclusion

Nous avons vu qu'en C, les tableaux unidirectionnels et les pointeurs ont des liens importants. Toutefois, il ne faut pas oublier la différence fondamentale qui est qu'un pointeur n'est qu'une adresse. Plus précisément, la déclaration d'un pointeur induit une réservation de mémoire pour une adresse, alors que la déclaration d'un tableau induit une réservation de mémoire de taille correspondant à la dimension déclarée et à la taille des éléments du tableau.

L'utilisation des pointeurs et de l'adressage dynamique peut générer des erreurs difficiles à cerner.

Intégrez le code suivant dans un programme qui appelle test_pointeur, exécutez-le, puis retirez la mise en commentaire de la dernière ligne de test_pointeur (appel de test_pointeur2).

Compilez et exécutez à nouveau.

L'application résultante de la compilation avec gcc provoque une erreur. Déterminez pourquoi !

L'utilisation d'un autre compilateur peut permettre de détecter l'erreur plus vide. Il est également possible qu'elle ne soit pas détectée.

Dans tous les cas, vous devez corriger et valider votre programme.

1
#include <string.h>
2
#include <stdlib.h>
3
void ftab(int tab[]){
4
	int i=0;
5
	for (;i<=6;++i)printf("%d  ", tab[i]);
6
	printf("\n");
7
}
8
9
void test_pointeur2(){
10
	char *prenom;
11
	char nom[15];
12
	char bonj[]="Bonjour";
13
	printf("votre prenom : "); fflush(stdout);
14
	scanf("%14s",&nom);
15
	if (14==strlen(nom))
16
		while(getchar() != '\n'); /* vidange du flux */
17
	prenom=malloc(strlen(nom)+1);
18
	strcpy(prenom,nom);
19
	printf("votre nom : "); fflush(stdout);
20
	scanf("%14s",&nom);
21
	if (14==strlen(nom))
22
		while(getchar() != '\n'); /* vidange du flux */
23
24
	size_t lg=strlen(bonj)+strlen(prenom)+strlen(nom)+1;
25
	char *phrase=(char *)malloc(lg);
26
	phrase[0]=0;
27
	strcat(phrase,bonj);
28
	strcat(phrase," ");
29
	strcat(phrase,prenom);
30
	strcat(phrase," ");
31
	strcat(phrase,nom);
32
	puts(phrase);
33
	free(phrase);
34
	return ;
35
}
36
37
38
void test_pointeur(){
39
  int montab[]={1, 2, 3, 4, 5, 6};
40
  int montab2[6]={1, 2, 3, 4, 5, 6};
41
42
	int *montab3=(int *)calloc(6,sizeof(int));
43
	int p;
44
	int (*pt)[6]=montab2;
45
	for (p=0 ; p<=6 ; ++p) montab3[p]=p*3;
46
47
	ftab(montab);
48
	ftab(montab3);
49
	ftab(&montab);
50
	ftab(&montab[0]);
51
	ftab(*pt);
52
	ftab(pt);
53
54
	//test_pointeur2();
55
	return ;
56
}