Pointeurs et mémoire

Tableaux multidimensionnels

Un tableau 2D natif est contigu et stocké par lignes dans les deux langages.

Qu’est-ce que Tableaux multidimensionnels ?

Un tableau 2D natif est contigu et stocké par lignes dans les deux langages.

Parcourez une matrice row-major et calculez les totaux.

Points importants

  • Un pointeur doit viser un objet vivant compatible ou être null.
  • Chaque allocation possédée doit être libérée exactement une fois.
  • Exprimez clairement ownership et const.

Exemples de code C et C++

C
Exécuter →
main.c
#include <stdio.h>

int main(void) {
    int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
    for (int row = 0; row < 2; ++row) {
        int total = 0;
        for (int column = 0; column < 3; ++column) total += matrix[row][column];
        printf("row %d=%d\n", row, total);
    }
    return 0;
}
Résultat attendu
row 0=6
row 1=15
C++
Exécuter →
main.cpp
#include <array>
#include <iostream>

int main() {
    std::array<std::array<int, 3>, 2> matrix{{{{1, 2, 3}}, {{4, 5, 6}}}};
    for (std::size_t row = 0; row < matrix.size(); ++row) {
        int total = 0;
        for (int value : matrix[row]) total += value;
        std::cout << "row " << row << '=' << total << '\n';
    }
}
Résultat attendu
row 0=6
row 1=15

Comparaison entre C et C++

Une fonction C doit connaître toutes les dimensions sauf la première ; std::array conserve les dimensions dans le type et propose at.

C

Ownership et nettoyage sont des conventions gérées manuellement.

C++

Les conteneurs et RAII encodent ownership et nettoyage dans la durée de vie.

Exercices pratiques

Exécutez les deux versions puis modifiez-les pour observer leurs garanties.

  • Testez null et les échecs d’allocation.
  • Utilisez AddressSanitizer et UndefinedBehaviorSanitizer.
  • Documentez l’ownership de chaque pointeur.