Как преобразовать массив Rust в указатель?

#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 на самом деле были указателями, гибкие элементы массива не были бы вещью.