Created
March 12, 2023 08:17
-
-
Save Hanaasagi/592ce539798ee7db5dd2ee531b1ef7b1 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#[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