質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1056閲覧

rustのスライスについて

takahashi1031

総合スコア7

参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2021/11/15 06:08

以下のような配列コピーのコードでmemcpyの引数 &[u8]のu8型のスライスというのがいまいちわかりません。
以下で言うと、bufの先頭アドレスの場所とbufの長さを参照しているという理解でいいのでしょうか。
詳しく教えていただきたいです。

rust

1fn main(){ 2 let buf =[1,2,3,4,5]; 3 let mut buf2=[0;5]; 4 5 memcpy(&mut buf2,&buf,buf.len()); 6 7 println!("{:?}",buf2); 8} 9 10fn memcpy(dst:&mut[u8],src:&[u8],n:usize){ 11 for i in 0..n{ 12 dst[i]=src[i]; 13 } 14}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

おおよそその通りです。

&[u8]&[u64]&str は内部的には先頭位置のポインタと、内部表現での要素数を保持しています。
単純に Vec 等から参照を得れば元の先頭アドレスと長さを引き継ぎますし、 十分に長いlet arr = [0u64; 64]; から &arr[2..5] のようにスライスを切り出せば、 arr[2] を先頭とする長さ3のスライスを得るという動作になります。

arr[100] のような範囲外操作が不正なメモリを読まずにpanicになるのは、参照するときに毎回インデックスが長さ未満であるかをチェックしているからです。
もっと直接的に、 slice.len() で長さの値をスライスから読むこともできます。

投稿2021/11/16 00:24

IgaguriMK

総合スコア148

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問