Тип c_void
Тип c_void - это непрозрачный тип из модуля std::ffi,
который используется для представления типа void
из языка C. В языке C void - это тип без значения,
который часто применяется в указателях для обозначения
«указателя на данные неизвестного типа». В Rust
c_void играет ту же роль при взаимодействии
с внешними функциями через extern "C".
Тип c_void нельзя создать как значение - у него нет
конструктора и нет размера, известного на этапе компиляции.
Он используется исключительно в составе сырых указателей:
*const c_void и *mut c_void. Такие указатели
обычно приводятся к конкретному типу через as или
методы cast. Работа с ними требует блока
unsafe, так как компилятор не может проверить
корректность такого приведения.
Синтаксис
use std::ffi::c_void;
*const c_void
*mut c_void
Пример
Давайте создадим указатель *const c_void из указателя
на конкретный тип и приведём его обратно:
use std::ffi::c_void;
fn main()
{
let value: i32 = 42;
let ptr: *const i32 = &value;
let void_ptr: *const c_void = ptr as *const c_void;
let back_ptr: *const i32 = void_ptr as *const i32;
unsafe
{
println!("{}", *back_ptr);
}
}
Результат выполнения кода:
42
Пример
Давайте используем *mut c_void для изменения значения
через приведение к конкретному типу:
use std::ffi::c_void;
fn main()
{
let mut value: i32 = 10;
let void_ptr: *mut c_void = &mut value as *mut i32 as *mut c_void;
let int_ptr: *mut i32 = void_ptr as *mut i32;
unsafe
{
*int_ptr = 99;
}
println!("{}", value);
}
Результат выполнения кода:
99
Пример
Давайте проверим, что указатель на c_void можно
сравнивать с нулевым указателем через is_null:
use std::ffi::c_void;
use std::ptr;
fn main()
{
let void_ptr: *const c_void = ptr::null();
println!("{}", void_ptr.is_null());
let value: i32 = 5;
let non_null: *const c_void = &value as *const i32 as *const c_void;
println!("{}", non_null.is_null());
}
Результат выполнения кода:
true
false
Смотрите также
-
ключевое слово
unsafe,
которое открывает доступ к небезопасным операциям -
тип
c_char,
который представляет C-тип char -
тип
c_int,
который представляет C-тип int -
блок
extern "C",
который объявляет функции с C-соглашением о вызовах