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 dansunsafe { ... },std::ptr::swapou 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 troispush->3.
peek()
Ajouter une méthode peek(&self) -> Option<i32> qui renvoie la valeur de tête
sans la retirer.
- Objectif : lire
(*head).dataenunsafesans 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 secondpeek()renvoie encoreSome(2); sur une liste vide ->None.