Les propriétés suivantes sont garanties lors de la mémorisation d'un tableau :
Cela implique qu'un tableau est mémorisé d'un seul bloc dans la mémoire. Il n'est
pas possible que le tableau soit dispersé à plusieurs endroit de la mémoire. De même
chaque cellule précède sa suivante dans la mémoire. La cellule tab[5]
est mémorisée
entre les cellules tab[4]
et tab[6]
.
Sur l'exemple suivant, on crée un tableau de caractères et on affiche l'adresse de chaque cellule du tableau. L'affichage confirme que les cellules du tableaux sont toutes consécutives :les adresses se suivent.
En informatique, il existe deux stratégies de mémorisation pour des tableaux multidimensionnels :
Row-major order : lignes dominantes ;
Un compilateur C organisera toujours les tableaux en lignes dominantes (row-major order). Considérons le tableau ci-dessous :
int tab[3][4]
Voici la représentation de ce tableau en mémoire :
Une erreur de segmentation (en anglais segmentation fault, en abrégé segfault) est le plantage d'une application qui a tenté d'accéder à un emplacement mémoire qui ne lui était pas alloué. Considérons, pour l'exemple, le tableau suivant :
int tab[10];
C'est un tableau de 10 cellules, numérotées de 0 à 9. Que se passe-t-il si l'on écrit au delà de la 10ème cellule ?
tab[218] = 666;
Le compilateur ne détecte les erreurs que pendant les transformations du code source en langage machine. L’écriture dans un élément dans une cellule non déclarée d'un tableau peut donc survenir. Selon le contexte, voici ce qu'il peut se passer :
Une erreur classique est d'écrire dans la (N+1)ème case d'un tableau de N cases :
int tab[10];
tab[10] = -1; // <= Segmentation fault
Écrire un programme qui affiche toutes les adresses des cellules du tableau à 2 dimensions ci-dessous :
char matrice[3][4];
L'affichage escompté est le suivant, on constate que toutes les adresses se suivent :
Adresse de matrice[0][0]: 0x7ffe50c80f48 Adresse de matrice[0][1]: 0x7ffe50c80f49 Adresse de matrice[0][2]: 0x7ffe50c80f4a Adresse de matrice[0][3]: 0x7ffe50c80f4b Adresse de matrice[1][0]: 0x7ffe50c80f4c Adresse de matrice[1][1]: 0x7ffe50c80f4d Adresse de matrice[1][2]: 0x7ffe50c80f4e Adresse de matrice[1][3]: 0x7ffe50c80f4f Adresse de matrice[2][0]: 0x7ffe50c80f50 Adresse de matrice[2][1]: 0x7ffe50c80f51 Adresse de matrice[2][2]: 0x7ffe50c80f52 Adresse de matrice[2][3]: 0x7ffe50c80f53
Le code ci-dessous déclare un tableau de 100 cellules et en affiche l'adresse (adresse de la première cellule). Augmenter la taille du tableau jusqu'à ce qu'il n'y ait plus assez de mémoire pour créer le tableau. Que se passe-t-il ?
int tab[100];
printf ("%p\n", &tab); // &tab équivalent à &tab[0], adresse de la première cellule
On donne la déclaration du tableau premiers
:
int premiers[5]={2,3,5,7,11};
Écrire un programme qui demande à l'utilisateur l'indice à afficher, puis affiche la cellule correspondant à l'indice saisi. Testez le programme avec des valeurs supérieurs à 4.
Cellule à afficher : 4 premiers[4] = 11
Cellule à afficher : 8 premiers[8] = 4195824
Cellule à afficher : 456465461
signal: segmentation fault (core dumped)
En C, les tableaux sont mémorisés ...
Considérons le tableau suivant. En mémoire, quelle cellule suivra la cellule carre[2][4]
?
char carre[10][10];
S'il n'y a pas assez de mémoire d'un seul tenant pour stocker un tableau. Que va t-il se passer ?
unsigned char image[200][300][3];
Qu'est-ce qu'une erreur de segmentation ?