Unsafe

Ces exercices portent sur les pointeurs bruts (*const T, *mut T), les blocs et fonctions unsafe, et la liste chaînée. Le chapitre est vu en survol : exercices courts, avec un bloc unsafe minimal et commenté.

Échanger via pointeurs bruts

Échanger les valeurs pointées par deux *mut i32, dans un bloc unsafe.

  • Objectif : *mut T, déréférencement dans unsafe { ... }, std::ptr::swap ou lecture/écriture manuelle.
  • Signature suggérée : fn echanger(a: *mut i32, b: *mut i32).
  • Cas de test : let (mut x, mut y) = (1, 2); echanger(&mut x, &mut y); -> x == 2 && y == 1.

Somme d'un buffer

Calculer la somme de n entiers consécutifs à partir d'un pointeur *const i32.

  • Objectif : unsafe fn, arithmétique de pointeurs (p.add(i)), déréférencement.
  • Signature suggérée : unsafe fn somme(p: *const i32, n: usize) -> i32.
  • Cas de test : pour let v = [1, 2, 3, 4];, unsafe { somme(v.as_ptr(), 4) } -> 10.

len() sur la liste chaînée

Ajouter à la liste chaînée unsafe du chapitre une méthode len(&self) -> usize qui suit les pointeurs next jusqu'au pointeur nul.

  • Objectif : parcours de pointeurs bruts, while !p.is_null(), unsafe.
  • Signature suggérée : impl LinkedList { fn len(&self) -> usize }.
  • Cas de test : liste vide -> 0 ; après trois push -> 3.

peek()

Ajouter une méthode peek(&self) -> Option<i32> qui renvoie la valeur de tête sans la retirer.

  • Objectif : lire (*head).data en unsafe sans modifier la liste.
  • Signature suggérée : impl LinkedList { fn peek(&self) -> Option<i32> }.
  • Cas de test : après push(1); push(2);, peek() -> Some(2), et un second peek() renvoie encore Some(2) ; sur une liste vide -> None.