当前位置: 首页 > 知识库问答 >
问题:

Rust 指针与向量的尊重

叶裕
2023-03-14

我不明白为什么println是*p1.offset(0)给我0。有什么想法吗?

fn main() {
        let p1 : *const u8 = vec![17u8,2u8].as_ptr();
        let p2 : *const u8 = "123".as_ptr();
        
        unsafe{
        println!("{}", *p1.offset(0) as u8);//should get 17, but I get 0
        println!("{}", *p2.offset(0) as char);
        }
}

这是游乐场的链接。https://play.rust-lang.org/?version=stable

共有2个答案

邢寒
2023-03-14

这是一个工作版本。

fn main() {
        let data = vec![17u8,2u8];
        let p1 : *const u8 = data.as_ptr();
        let p2 : *const u8 = "123".as_ptr();
        
        unsafe{
        println!("{}", *p1.offset(0) as u8); // not get 17 instead of 0
        println!("{}", *p2.offset(0) as char);
        }
}

我不知道为什么需要提取向量来分离变量

魏风华
2023-03-14

指针并不拥有它们所指向的对象,所以当你这样做时:

let p1 : *const u8 = vec![17u8,2u8].as_ptr();

发生的事件顺序是:

  • 构建了一个Vec,在堆上分配了一个缓冲区
  • 调用as_ptr(),返回指向缓冲区的指针。
  • Vec被丢弃,因为没有任何东西拥有它,因此缓冲区被释放。
  • 稍后取消对指针的引用时,将调用未定义的行为

第二种情况工作正常:

let p2 : *const u8 = "123".as_ptr();

因为“123”是字符串文本,而字符串文本具有“静态生存期 ” - 它们的持续时间与程序本身一样长。

 类似资料:
  • 6. 指向指针的指针与指针数组 指针可以指向基本类型,也可以指向复合类型,因此也可以指向另外一个指针变量,称为指向指针的指针。 int i; int *pi = &i; int **ppi = π 这样定义之后,表达式*ppi取pi的值,表达式**ppi取i的值。请读者自己画图理解i、pi、ppi这三个变量之间的关系。 很自然地,也可以定义指向“指向指针的指针”的指针,但是很少用到: int

  • 指针可以指向一份普通类型的数据,例如 int、double、char 等,也可以指向一份指针类型的数据,例如 int *、double *、char * 等。 如果一个指针指向的是另外一个指针,我们就称它为 二级指针,或者 指向指针的指针。 假设有一个 int 类型的变量 a,p1是指向 a 的指针变量,p2 又是指向 p1 的指针变量,它们的关系如下图所示: 将这种关系转换为C语言代码: 指针变

  • 但我想使用一个指针,而不是一个简单的变量。能给我点启示吗? 谢谢

  • 在下面给出的代码中,我声明了一个指向int的指针,我们都知道memcpy返回一个指向目标字符串的空指针,所以如果ptr是指向int的指针,那么为什么printf(“%s”,ptr);是完全有效的,ptr毕竟不是指向char的指针。

  • 问题内容: 我是Java菜鸟。我已经掌握了将C / C ++指针转换为Java引用的概念,并且进展相当顺利。 我打了一段有指针的代码(即* ptr)。我需要取消引用指针并更改其指向的指针的值(即 ptr =&newthing;) 在Java中这似乎要困难得多。是否有人对如何解决此问题有任何想法?快速谷歌搜索什么都没有。 这是C ++中的代码示例。我想在Java中获得类似的工作,但是ptr_to_p

  • 本文向大家介绍什么是指向指针的指针? 相关面试题,主要包含被问及什么是指向指针的指针? 时的应答技巧和注意事项,需要的朋友参考一下 指针指向的变量是一个指针,即具体内容为一个指针的值,是一个地址. 此时指针指向的变量长度也是4位.