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

  1. État initial

    ../../_images/pile-tas-etat-initial.png
  1. Déclaration du tableau

        vector<int> t;
    
    ../../_images/pile-tas-declaration.png
  1. Allocation du tableau

        t = vector<int>(6);
    
    ../../_images/pile-tas-allocation.png
  1. Initialisation

        t[0] = 1;
        ...
    
    ../../_images/pile-tas-initialisation-1.png

Sémantique: Allocation d’un tableau

t = vector<int>(6);
  1. Une suite contiguë de cases est allouée sur le tas

  2. 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 tableau

  • Obtenue 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/)

../../_images/xkcd_heartbleed_explanation_1.png ../../_images/xkcd_heartbleed_explanation_2.png

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:

    1. Déclaration

    2. Allocation Sans cela: faute de segmentation (au mieux!)

    3. Initialisation Sans cela: même problème qu’avec les variables usuelles

  • Lors de l’accès à une case i d’un tableau t, il faut toujours vérifier les bornes: 0 <= i et i < 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é!