< 返回版块

cybertheye 发表于 2024-02-25 15:03

Tags:heap,address

let s = String::from("hello");

如何获取 在堆内存中真正保存 hello 字符串的地址?

评论区

写评论
Bai-Jinlin 2024-02-26 10:26

第一个不用讲了,第二个会得到堆地址,过程其实比看上去复杂。

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);     //堆地址??
Louys·Miaoa 豆沙饼 2024-02-26 09:12

这两个地址有啥区别呢,有大神能给说说吗?

println!("{:p}", &s);           //栈地址??
println!("{:x}", s.as_ptr() as usize);     //堆地址??
Binwalker 2024-02-25 17:51
println!("{:x}", s.as_ptr() as usize);
Bai-Jinlin 2024-02-25 17:50

s.as_ptr()

1 共 4 条评论, 1 页