Функция copy_nonoverlapping
Функция copy_nonoverlapping из модуля std::ptr
копирует count элементов типа T из области памяти,
на которую указывает src, в область памяти, на которую
указывает dst. Функция является небезопасной
(unsafe), потому что работает с сырыми указателями
и не проверяет корректность адресов. Параметром функция
принимает указатель назначения dst, указатель источника
src и количество копируемых элементов count.
Области памяти не должны пересекаться, иначе поведение
не определено - для пересекающихся областей используйте
copy.
Синтаксис
unsafe fn copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: usize)
Пример
Давайте скопируем массив чисел из одного места в другое:
fn main()
{
let src = [1, 2, 3, 4, 5];
let mut dst = [0; 5];
unsafe {
std::ptr::copy_nonoverlapping(
src.as_ptr(),
dst.as_mut_ptr(),
5
);
}
println!("{:?}", dst);
}
Результат выполнения кода:
[1, 2, 3, 4, 5]
Пример
Давайте скопируем только часть элементов массива:
fn main()
{
let src = [1, 2, 3, 4, 5];
let mut dst = [0; 5];
unsafe {
std::ptr::copy_nonoverlapping(
src.as_ptr(),
dst.as_mut_ptr(),
3
);
}
println!("{:?}", dst);
}
Результат выполнения кода:
[1, 2, 3, 0, 0]
Пример
Давайте скопируем строковые данные из вектора в буфер:
fn main()
{
let src = vec![b'a', b'b', b'c', b'd', b'e'];
let mut dst = vec![0u8; 5];
unsafe {
std::ptr::copy_nonoverlapping(
src.as_ptr(),
dst.as_mut_ptr(),
src.len()
);
}
let res = String::from_utf8(dst).unwrap();
println!("{}", res);
}
Результат выполнения кода:
"abcde"
Смотрите также
-
функция
copy,
которая копирует данные между пересекающимися областями памяти -
функция
read,
которая читает значение из указателя без его перемещения -
функция
write,
которая записывает значение по указателю без чтения старого -
тип
const-pointer,
который представляет сырой неизменяемый указатель