如何在Rust中索引C数组?

问题描述 投票:3回答:2

我有一个返回指针的C函数:

type MYSQL_RES_REF = *mut c_void;
type MYSQL_ROW = *const *const c_char;

#[no_mangle]
extern "C" {
    fn mysql_fetch_row(res: MYSQL_RES_REF) -> MYSQL_ROW;
}

let pointer = mysql_fetch_row(self.res);
let row_p = match pointer {
    p if p == (0 as *const *const c_char) => panic!(),
    p => p,
};

let field: &[u8] = unsafe { ffi::c_str_to_bytes(row_p[i]) };

但尝试索引它(最后一行)会导致错误:

error: cannot index a value of type `*const *const i8`

我想知道std::c_vec是否是我想要的,但是apparently that has been removed

arrays rust ffi
2个回答
5
投票

有一个offset method on pointers可以用作:

let new_p = p.offset(i);

得到一个指针i元素远离当前的元素。显然,它不受边界检查,因此您必须确保它保持在边界内(或者一个接一个地)。


还有一个不稳定的offset intrinsic


0
投票

如果你有C数组的长度,你可以将指针和长度转换为Rust切片,然后使用切片的所有现有支持:

use libc::size_t; // 0.2.51
use std::slice;

/// Our opaque C type
#[repr(C)]
struct MyCType {
    private: [u8; 0],
}

extern "C" {
    fn get_ptr_and_len(len: *mut size_t) -> *const MyCType;
    fn do_something_with_type(v: *const MyCType);
}

fn ptr_and_len() {
    unsafe {
        let mut len = 0;
        let ptr = get_ptr_and_len(&mut len);

        let slice = slice::from_raw_parts(ptr, len);

        // Indexing
        do_something_with_type(&slice[42]);

        // Iteration
        for v in slice {
            do_something_with_type(v);
        }
    }
}

也可以看看:

© www.soinside.com 2019 - 2024. All rights reserved.