cybertheye 发表于 2024-02-25 15:03
Tags:heap,address
let s = String::from("hello");
如何获取 在堆内存中真正保存 hello 字符串的地址?
第一个不用讲了,第二个会得到堆地址,过程其实比看上去复杂。
s.as_ptr()等价于s.deref().as_ptr()。String的内部有个叫vec的Vec成员,String deref中首先对这个Vec进行deref,这个deref会用Vec内部指向堆的指针以及长度构建出&slice,所以&slice就是指向堆组成的。然后用这个&slice构建出&str基本就是&slice转了下形,as_ptr也就是把这个&str转型成raw pointer。
-- 👇 豆沙饼 is Louys: 这两个地址有啥区别呢,有大神能给说说吗?
println!("{:p}", &s); //栈地址?? println!("{:x}", s.as_ptr() as usize); //堆地址??
这两个地址有啥区别呢,有大神能给说说吗?
println!("{:x}", s.as_ptr() as usize);
s.as_ptr()
评论区
写评论第一个不用讲了,第二个会得到堆地址,过程其实比看上去复杂。
s.as_ptr()等价于s.deref().as_ptr()。String的内部有个叫vec的Vec成员,String deref中首先对这个Vec进行deref,这个deref会用Vec内部指向堆的指针以及长度构建出&slice,所以&slice就是指向堆组成的。然后用这个&slice构建出&str基本就是&slice转了下形,as_ptr也就是把这个&str转型成raw pointer。
--
👇
豆沙饼 is Louys: 这两个地址有啥区别呢,有大神能给说说吗?
这两个地址有啥区别呢,有大神能给说说吗?
s.as_ptr()