首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何得到下一个指针?

如何得到下一个指针?
EN

Stack Overflow用户
提问于 2017-05-01 19:32:52
回答 1查看 598关注 0票数 0

我有一个用C实现的函数,我想用相同的接口用Rust编写一个函数。函数接收指向数组(win8_t *)开头和数组长度的指针。我需要能够通过数组。

一定有更好的方法来获得下一个价值,但现在我可以做一件奇怪的事情:

代码语言:javascript
复制
use std::mem;
pub extern "C" fn print_next(i: *const u8) {
    let mut ii = unsafe { mem::transmute::<*const u8, i64>(i) };
    ii += 1;
    let iii = unsafe { mem::transmute::<i64, *const u8>(ii) };
    let jj = unsafe { *iii };
    println!("{}", jj); // jj is next value
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-02 06:59:13

正如Shepmaster所说,您可能需要提供切片的长度。

在大多数情况下,您使用指针时,您的函数将是不安全的(因为您通常需要在某个时候取消引用它)。将安全责任委托给来电者可能是个好主意,将其标记为不安全。

下面是一些使用offsetfrom_raw_slice的示例

代码语言:javascript
复制
use std::mem;
use std::slice;

// unsafe!
pub extern "C" fn print_next(i: *const u8) {
    let mut ii = unsafe { mem::transmute::<*const u8, i64>(i) };
    ii += 1;
    let iii = unsafe { mem::transmute::<i64, *const u8>(ii) };
    let jj = unsafe { *iii };
    println!("{}", jj); // jj is next value
}

// unsafe!
pub unsafe extern "C" fn print_next2(i: *const u8) {
    let j = *i.offset(1);
    println!("{}", j);
}

// (less but still ...) unsafe!
pub unsafe extern "C" fn print_next3(i: *const u8, len: usize) {
    let slice = slice::from_raw_parts(i, len);
    // we are not checking the size ... so it may panic!
    println!("{}", slice[1]);
}

fn main() {
    let a = [9u8, 4, 6, 7];
    print_next(&a as *const u8);
    unsafe {
        print_next2(&a[1] as *const u8);
        print_next3(&a[2] as *const u8, 2);
    }

    // what if I print something not in a??
    print_next(&a[3] as *const u8); // BAD
    unsafe { 
        print_next2(&a[3] as *const u8); // BAD
        print_next3(&a[3] as *const u8, 2); // as bad as others, length is wrong

        print_next3(&a[3] as *const u8, 1); // panic! out of bounds
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43725279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档