Modèle de mémoire et tableaux#
L’espace mémoire d’un programme est partagé en deux zones :
La pile : variables locales des fonctions
Le tas : le reste
Exemple de construction d’un tableau#
#include<vector>
using namespace std;
vector<int> t; // Déclaration
t = vector<int>(6); // Allocation
t[0] = 1; // Initialisation
t[1] = 4;
t[2] = 1;
t[3] = 5;
t[4] = 9;
Exemple de construction d’un tableau : mémoire#
Sémantique : allocation d’un tableau#
t = vector<int>(6);
Une suite contiguë de cases est allouée sur le tas
La taille et une référence vers la première des cases est stockée dans
t
Sémantique : lecture et écriture dans un tableau#
t[i]
Donne la
i
-ème case du tableauObtenue en suivant la référence et se décalant de \(i\) cases
Rappel : pas de vérifications!!!
Retour sur l”exemple de piratage par débordement#
Heartblead expliqué (http://xkcd.com/1354/)#
Tableaux et allocation mémoire#
À retenir :
Une valeur de type tableau ne contient pas directement les cases du tableau, mais l’adresse en mémoire de celles-ci (référence) et la taille du tableau.
Une variable de type tableau se construit en trois étapes :
Déclaration
Allocation Sans cela : faute de segmentation (au mieux!)
Initialisation Sans cela : même problème qu’avec les variables usuelles
Lors de l’accès à une case
i
d’un tableaut
, il faut toujours vérifier les bornes :0 <= i
eti < t.size()
Sans cela : faute de segmentation (au mieux!)
Sémantique : affectation de tableaux#
Exemple :
Quelles sont les valeurs de t[0]
et t2[0]
après l’exécution du
programme suivant?
vector<int> t = { 1, 4, 1, 5, 9, 2 };
vector<int> t2;
t2 = t; // Affectation
t2[0] = 0;
À retenir :
En C++, lors d’une affectation, un
vector
est copié!On dit que
vector
a une sémantique de copie.Différent de Java, Python ou des
array
en C!
Sémantique : tableaux et fonctions ♣#
Exemple :
Quelle est la valeur de tableau[0]
après l’exécution du programme
suivant?
void modifie(vector<int> tableau) {
tableau[0] = 42;
}
vector<int> tableau = { 1, 2, 3, 4 };
modifie(tableau);
Fonctions et tableaux :
Affectation des paramètres \(\Longrightarrow\) copie
Donc, les
vector
de C++ sont passés par valeur aux fonctions
Mais la fonction peut renvoyer le tableau modifié!