РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1183 of 1245 menu

Тип 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-соглашением о вызовах
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить