#rust
#Ржавчина
Вопрос:
Я не смог найти простую вещь в Google. Как преобразовать простой массив Rust в указатель?
Как получить указатель на [u8; 3]
? Я пытался сделать as *mut u8
, но это не сработало.
Комментарии:
1. Почему вы хотите это сделать? Указатели не так полезны в Rust, как в C. Если вы объясните, почему вы этого хотите, то, возможно, кто-нибудь сможет дать вам лучший, более идиоматичный способ Rust делать все, что вы хотите.
2. @Jesper спасибо за заботу о безопасности при программировании на Rust. Мне нужно это, чтобы поговорить с C, особенно о привязке OpenGL для Rust. Да, я мог бы использовать glutin, который безопасен. Действительно, я уже использую его, но я пишу его в чистых вызовах OpenGL C для сравнения с glutin, а также для поддержки внешних текстур (что, я считаю, невозможно с glutin)
Ответ №1:
Используйте as_ptr()
или as_mut_ptr()
.
fn main() {
let a: [u8; 3] = [1, 2, 3];
println!("{:p}", a.as_ptr());
}
0x7ffc97350edd
Массивы принудительно преобразуются в срезы, поэтому для массива может быть вызван любой метод среза.
Ответ №2:
Обратите внимание, что массивы в Rust — это просто большие двоичные объекты памяти. Они не указывают на некоторые сохраненные объекты, как это делают массивы в C, они представляют собой последовательность объектов.
Если у вас есть какие-то данные и вы хотите получить указатель на них, вы обычно создаете вместо этого ссылку, поскольку только ссылки (и другие указатели) могут быть приведены к указателям с помощью as
:
fn main() {
let a: [u8; 3] = [1, 2, 3]; // a blob of data on the stack...
let a_ref = amp;a; // a shared reference to this data...
let a_ptr = a_ref as *const u8; // and a pointer, created from the reference
println!("{:p}", a_ptr);
}
Комментарии:
1. Массивы FWIW C также являются «последовательностями объектов», они распадаются на указатели, но сами по себе они не являются указателями. Взаимодействие IIRC с массивами C является странным и непоследовательным из-за обратной совместимости с BCPL, где массив фактически был указателем на отдельное местоположение. Если бы массивы C на самом деле были указателями, гибкие элементы массива не были бы вещью.