Cours 9.4. Comment les tableaux sont stockés en mémoire en C?

Stockage des tableaux en mémoire

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].

Organisation des tableaux dans la mémoire en C

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.

Colonnes ou lignes dominantes

En informatique, il existe deux stratégies de mémorisation pour des tableaux multidimensionnels :

Tableaux multidimensionnels

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 :

Mémoire pour un tableau multidimensionnel en C

Erreur de segmentation

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 :

Erreur de segmentation lors de l'écriture hors d'un tableau en C

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

Exercices

Exercice 1

É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

Exercice 2

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

Exercice 3

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)

Quiz

En C, les tableaux sont mémorisés ...

Vérifier Bravo ! Un compilateur C organisera toujours les tableaux en lignes dominantes (row-major order) Essaie encore ...

Considérons le tableau suivant. En mémoire, quelle cellule suivra la cellule carre[2][4] ?

char carre[10][10];
Vérifier Bravo ! Consultez cette section si vous n'êtes pas convaincu. Essaie encore ...

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];
Vérifier Bravo ! Le tableau n'est pas créé s'il n'y a pas assez de mémoire. Essaie encore ...

Qu'est-ce qu'une erreur de segmentation ?

Vérifier Bravo ! Une erreur de segmentation (en anglais segmentation fault, en abrégé segfault) est un plantage d'une application qui a tenté d'accéder à un emplacement mémoire qui ne lui était pas alloué. Essaie encore ...

Voir aussi


Dernière mise à jour : 24/11/2022