Skip to content

Instantly share code, notes, and snippets.

@Hanaasagi
Created March 12, 2023 08:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Hanaasagi/592ce539798ee7db5dd2ee531b1ef7b1 to your computer and use it in GitHub Desktop.
Save Hanaasagi/592ce539798ee7db5dd2ee531b1ef7b1 to your computer and use it in GitHub Desktop.
#[derive(PartialEq, Eq, Clone, Debug)]
pub struct ListNode {
pub val: i32,
pub next: Option<Box<ListNode>>,
}
impl ListNode {
#[inline]
fn new(val: i32) -> Self {
ListNode { next: None, val }
}
}
#[inline(never)]
fn get_linklist() -> Box<ListNode> {
let mut head = Box::new(ListNode::new(0));
let mut node_1 = Box::new(ListNode::new(1));
let mut node_2 = Box::new(ListNode::new(2));
node_1.next = Some(node_2);
head.next = Some(node_1);
head
}
#[inline(never)]
fn test() {
println!("ListNode size: {:?}", std::mem::size_of::<ListNode>());
println!("&ListNode size: {:?}", std::mem::size_of::<&ListNode>());
println!("Box<ListNode> size: {:?}\r\n", std::mem::size_of::<Box<ListNode>>());
let head = get_linklist();
let mut slow = head.as_ref();
let mut fast = head.as_ref();
let prev = slow;
slow = slow.next.as_ref().unwrap();
fast = fast.next.as_ref().unwrap();
fast = fast.next.as_ref().unwrap();
// head -> node_1 -> node_2
// prev -> slow -> fast
println!("Address and memory bytes:");
println!("prev =====> {:p}", prev);
debug_memory(prev);
println!("slow =====> {:p}", slow);
debug_memory(slow);
println!("fast =====> {:p}", fast);
debug_memory(fast);
unsafe {
let n = &mut *(prev as *const ListNode as *mut ListNode);
n.val = 15;
n.next = None;
}
println!("\r\n----After changed----\r\n");
println!("Address and memory bytes:");
println!("prev =====> {:p}", prev);
debug_memory(prev);
println!("slow =====> {:p}", slow);
debug_memory(slow);
println!("fast =====> {:p}", fast);
debug_memory(fast);
// segmentation fault here
println!("{:?}", slow.next);
println!("Never got here");
}
#[inline(never)]
fn main() {
test()
}
#[inline(never)]
fn debug_memory(node: &ListNode) {
let view = node as *const _ as *const u8;
for i in 0..(std::mem::size_of::<ListNode>() as isize) {
print!("{:02x} ", unsafe { *view.offset(i) });
}
println!();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment