<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>「スタックメモリ」タグの記事一覧｜Rust Tech</title>
	<atom:link href="https://rust-tech.nkhn37.net/tag/stack-memory/feed/" rel="self" type="application/rss+xml" />
	<link>https://rust-tech.nkhn37.net</link>
	<description>Rustプログラミング学習サイト</description>
	<lastBuildDate>Fri, 20 Mar 2026 22:54:44 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.2</generator>

<image>
	<url>https://rust-tech.nkhn37.net/wp-content/uploads/2025/06/cropped-lion-preasure-clear-32x32.png</url>
	<title>「スタックメモリ」タグの記事一覧｜Rust Tech</title>
	<link>https://rust-tech.nkhn37.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【Rust入門】String 型と文字列スライス &#038;str 型の基本について分かりやすく解説</title>
		<link>https://rust-tech.nkhn37.net/rust-string-str-basic/</link>
					<comments>https://rust-tech.nkhn37.net/rust-string-str-basic/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Sun, 03 Aug 2025 20:00:00 +0000</pubDate>
				<category><![CDATA[Rust入門]]></category>
		<category><![CDATA[&str]]></category>
		<category><![CDATA[string]]></category>
		<category><![CDATA[スタックメモリ]]></category>
		<category><![CDATA[ヒープメモリ]]></category>
		<category><![CDATA[マルチバイト文字]]></category>
		<category><![CDATA[借用]]></category>
		<category><![CDATA[所有権]]></category>
		<category><![CDATA[文字列スライス]]></category>
		<category><![CDATA[静的メモリ]]></category>
		<guid isPermaLink="false">https://rust-tech.nkhn37.net/?p=819</guid>

					<description><![CDATA[Rust で文字列を扱うための String 型と文字列スライス &#38;str 型の基本を初心者にも分かりやすく解説します。 Rust の文字列 どのプログラミング言語においても文字列を適切に扱えるようになることは非 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Rust で文字列を扱うための <span class="jinr-d--text-color d--marker1 d--bold"><code>String</code> 型と文字列スライス <code>&amp;str</code> 型</span>の基本を初心者にも分かりやすく解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">Rust の文字列</h2>



<p class="wp-block-paragraph">どのプログラミング言語においても文字列を適切に扱えるようになることは非常に重要です。Rust では、文字列を扱う際に主に登場するのが「<span class="jinr-d--text-color d--marker1 d--bold"><code>String</code> 型</span>」と「<span class="jinr-d--text-color d--marker1 d--bold">文字列スライス <code>&amp;str</code> 型</span>」の2つです。</p>



<p class="wp-block-paragraph"><code>String</code> 型は Rust の標準ライブラリとして提供される可変長の文字列型です。<code>String</code> 型は、文字列リテラル（例：<code>"Hello"</code>）とは異なり、ヒープ領域に格納されて動的にメモリが確保されます。</p>



<p class="wp-block-paragraph">文字列スライス（<code>&amp;str</code>） は、UTF-8 エンコードされた文字列データへの参照（借用）です。データ本体は別の場所（静的領域やヒープ領域）に存在し、<code>&amp;str</code> はその一部または全体を参照する仕組みです。</p>



<p class="wp-block-paragraph">この記事では、Rust の <code>String</code> 型と文字列スライス <code>&amp;str</code> 型について分かりやすく解説します。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">所有権や借用については以下の記事も参考にしてください。</p>



<p class="wp-block-paragraph"><a href="https://rust-tech.nkhn37.net/rust-ownership-borrowing-basic/" target="_blank" rel="noreferrer noopener">【Rust入門】所有権と借用の基本を分かりやすく解説</a></p>
</div>
		</div></section>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box1  "><div class="a--simple-box-title d--bold">メモリ領域</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">メモリ領域の中には「テキスト領域」「静的領域」「スタック領域」「ヒープ領域」があります。以降の説明で必要になりますので簡単に紹介します。</p>



<ul class="wp-block-list jinr-list">
<li>テキスト領域：プログラムの実行コードが格納されます。</li>



<li>静的領域：<code>static</code>&nbsp;変数など、プログラム全体を通じて使う値を格納します。</li>



<li>スタック領域：基本型（<code>i32</code> など）のサイズが決まった小さな値が置かれます。</li>



<li>ヒープ領域：<code>String</code>&nbsp;のようにサイズが実行時に決まるデータが使用する領域です。</li>
</ul>
</div></div></section>



<div id="nkhn3-2290832197" class="nkhn3- nkhn3-entity-placement" style="margin-left: auto;margin-right: auto;text-align: center;"><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9478001176347002"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-9478001176347002"
     data-ad-slot="4670569211"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></div><h2 class="wp-block-heading jinr-heading d--bold"><code>String</code> 型</h2>



<h3 class="wp-block-heading jinr-heading d--bold"><code>String</code> 型とは</h3>



<p class="wp-block-paragraph">Rust における <span class="jinr-d--text-color d--marker1 d--bold"><code>String</code> 型</span>は、可変長でありかつ所有権を持つ文字列型です。<code>String</code> は、ヒープ領域に格納され、実行時にサイズを変更したり、編集したりすることが可能です。ユーザーからの入力やファイルから読み込むデータ等、動的に得られる文字列を保持したいときには <code>String</code> を使用します。</p>



<h3 class="wp-block-heading jinr-heading d--bold"><code>String</code> 型の使い方</h3>



<h4 class="wp-block-heading jinr-heading d--bold">String::from() を使用する</h4>



<p class="wp-block-paragraph"><code>String</code> を生成する一般的な方法は、標準ライブラリの <code>String</code> 型の関連関数 <code><span class="jinr-d--text-color d--marker1 d--bold">String::from()</span></code> を用いて生成する方法です。ヒープ上に新たに <code>String</code> の文字列が確保されます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn main() {
    // 関連関数 from を使って生成
    let s = String::from("HelloWorld");

    println!("{}", s);
}</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
HelloWorld</pre>



<h4 class="wp-block-heading jinr-heading d--bold">to_string() メソッドを使用する</h4>



<p class="wp-block-paragraph">文字列スライスに対して <code><span class="jinr-d--text-color d--marker1 d--bold">to_string()</span></code> メソッドを呼び出すことで、<code>String</code> に変換することも可能です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn main() {
    // to_string メソッドを使って生成
    let s = "HelloWorld".to_string();

    println!("{}", s);
}</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
HelloWorld</pre>



<h4 class="wp-block-heading jinr-heading d--bold"><code>format</code> マクロを使用する</h4>



<p class="wp-block-paragraph"><code><span class="jinr-d--text-color d--marker1 d--bold">format</span></code> マクロを使うことで <code>String</code> 文字列を生成できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn main() {
    // format マクロを使って生成
    let part = "World";
    let s = format!("Hello{}", part);

    println!("{}", s);
}</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
HelloWorld</pre>



<p class="wp-block-paragraph"><code>print</code> マクロが、コンソールに文字列を出力するのに対して、<code>format</code> マクロは <code>String</code> オブジェクトを返します。変数の値を埋め込んで文字列を生成したい場合に便利です。</p>



<h4 class="wp-block-heading jinr-heading d--bold">関連関数 <code>String::new()</code> を使用する</h4>



<p class="wp-block-paragraph">関連関数である <code><span class="jinr-d--text-color d--marker1 d--bold">String::new</span></code> 関数を使うことでも生成ができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn main() {
    // 関連関数 new を使って生成
    let mut s = String::new();
    // 文字列を追加
    s.push_str("HelloWorld");

    println!("{}", s);
}</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
HelloWorld</pre>



<p class="wp-block-paragraph">変数宣言時点では、文字列が決まっておらず後で決まるような場合には、あらかじめ <code>new</code> で用意しておいて、 <code>push_str</code> メソッドなどで文字列を追加して使用します。<code>String</code> 型の各種メソッドについては後ほど詳しく説明します。</p>



<h3 class="wp-block-heading jinr-heading d--bold"><code>String::from()</code> と <code>to_string()</code> の違い</h3>



<p class="wp-block-paragraph"><code>String::from()</code> と <code>to_string()</code> メソッドはどちらも同じ動作をするため、どちらの方法を利用しても構いません。内部的には、<code>String::from()</code> は、<code>String</code> 型の関連関数として定義されており、一方で <code>to_string()</code> メソッドは、<code>ToString</code> トレイトの実装に依存しています。</p>



<p class="wp-block-paragraph">例えば、上記例の <code>"HelloWorld"</code> は、文字列スライス <code>&amp;'static str</code> 型です。文字列スライスについては後ほど説明しますが、<code>&amp;str</code> 型は <code>ToString</code> トレイトを実装しているため <code>String</code> 型に変換できます。</p>



<p class="wp-block-paragraph">どちらを利用するかは好みやスタイルの違いで選んでも基本的には問題ありませんが、<code>to_string()</code> は <code>ToString</code> トレイトの実装に依存しており場合によっては期待しない型変換が行われない可能性もあります。明示的な意図を示す場合や型安全性を重視する場面では <code>String::from()</code> を使用するとより安全です。</p>



<h3 class="wp-block-heading jinr-heading d--bold">String 変数の変更（文字列の追加・結合・削除）</h3>



<p class="wp-block-paragraph"><code>String</code> 型の変数はヒープ領域に格納されているので文字列の追加や削除といったことが可能です。文字列の変更では、以下のようなメソッドを使用できます。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>区分</th><th>メソッド・演算子</th><th>概要</th></tr></thead><tbody><tr><td>追加</td><td><code>push(char)</code></td><td>1文字（<code>char</code> 型）を末尾に追加</td></tr><tr><td>追加</td><td><code>push_str(&amp;str)</code></td><td>文字列スライス（&amp;str 型）を末尾に追加</td></tr><tr><td>追加</td><td><code>insert(index, char)</code></td><td>指定バイト位置に1文字を追加</td></tr><tr><td>追加</td><td><code>insert_str(index, &amp;str)</code></td><td>指定バイト位置に文字列スライス（<code>&amp;str</code> 型）を追加</td></tr><tr><td>結合</td><td><code>+</code> 演算子</td><td>複数の文字列を結合（右辺は参照である必要があり、左辺はムーブされるので注意）</td></tr><tr><td>結合</td><td><code>format</code> マクロ</td><td>複数の文字列を結合<br>（元の変数の所有権はムーブせずに結合可能）</td></tr><tr><td>削除</td><td><code>pop()</code></td><td>末尾の1文字を削除<br>（<code>Option&lt;char&gt;</code> 型で返却）</td></tr><tr><td>削除</td><td><code>remove(index)</code></td><td>指定バイト位置の1文字を削除</td></tr><tr><td>削除</td><td><code>truncate(index)</code></td><td>指定バイト位置以降を削除</td></tr><tr><td>削除</td><td><code>clear()</code></td><td>文字列を全て削除</td></tr></tbody></table></figure>



<h4 class="wp-block-heading jinr-heading d--bold">文字列の追加</h4>



<p class="wp-block-paragraph">文字列の追加では、<code><span class="jinr-d--text-color d--marker1 d--bold">push</span></code>、<code><span class="jinr-d--text-color d--marker1 d--bold">push_str</span></code>、<code><span class="jinr-d--text-color d--marker1 d--bold">insert</span></code>、<code><span class="jinr-d--text-color d--marker1 d--bold">insert_str</span></code> メソッドを使用できます。</p>



<ul class="wp-block-list jinr-list">
<li><code>push</code>：末尾に 1 文字追加します。</li>



<li><code>push_str</code>：末尾に文字列を追加します。</li>



<li><code>insert</code>：指定バイト位置に 1 文字追加します。</li>



<li><code>insert_str</code>：指定バイト位置に文字列を追加します。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn main() {
    // push(char) で1文字末尾に追加
    let mut s1 = String::from("HelloWorld");
    s1.push('!');
    println!("{}", s1);

    // push_str(&amp;str) で文字列スライスを末尾に追加
    let mut s2 = String::from("Hello");
    s2.push_str("World!");
    println!("{}", s2);

    // insert(index, char) で指定バイト位置に1文字を追加
    let mut s3 = String::from("HeloWorld!");
    s3.insert(3, 'l');
    println!("{}", s3);

    // insert_str(index, &amp;str) で指定バイト位置に文字列スライスを追加
    let mut s4 = String::from("Helrld!");
    s4.insert_str(3, "loW");
    println!("{}", s3);
}</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
HelloWorld!
HelloWorld!
HelloWorld!
HelloWorld!</pre>



<h4 class="wp-block-heading jinr-heading d--bold">文字列の結合</h4>



<p class="wp-block-paragraph">文字列の結合では、<span class="jinr-d--text-color d--marker1 d--bold"><code>+</code> 演算子</span>か <span class="jinr-d--text-color d--marker1 d--bold"><code>format</code> マクロ</span>を使用できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn main() {
    // +演算子で文字列を結合する
    let s1 = String::from("Hello");
    let s2 = String::from("World");
    
    // s1 の所有権はムーブするので注意、s2 は参照を渡す必要がある
    let s3 = s1 + &amp;s2;
    println!("{}", s3);

    // s1 の所有権は移動するので以下はコンパイルエラー
    // println!("{}", s1);

    // format マクロで結合する（ムーブなしで結合可能）
    let s1 = String::from("Hello");
    let s2 = String::from("World");

    // format で結合
    let s3 = format!("{}{}", s1, s2);
    println!("{}", s3);
    // ムーブしないので元の変数も使用できる。
    println!("{}", s1);
    println!("{}", s2);
}</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
HelloWorld
HelloWorld
Hello
World</pre>



<p class="wp-block-paragraph"><code>+</code> 演算子の場合、左辺の変数の所有権はムーブするため、以降では使えなくなるので注意が必要です。また、右辺の変数は参照を渡す必要があります。</p>



<p class="wp-block-paragraph">一方、<code>format</code> マクロで結合する場合には、元の変数の所有権を保持したまま <code>String</code> を生成するため、結合後も元の変数を使用することができます。また、<code>format</code> マクロは内部的には参照として処理されるため、変数はそのまま渡すことができます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">文字列の削除</h4>



<p class="wp-block-paragraph">文字列の削除では、<code><span class="jinr-d--text-color d--marker1 d--bold">pop</span></code>、<code><span class="jinr-d--text-color d--marker1 d--bold">remove</span></code>、<code><span class="jinr-d--text-color d--marker1 d--bold">truncate</span></code>、<code><span class="jinr-d--text-color d--marker1 d--bold">clear</span></code> メソッドを使用できます。</p>



<ul class="wp-block-list jinr-list">
<li><code>pop</code>：末尾から1文字を削除し、<code>Option&lt;char&gt;</code> で削除した文字列を返します。</li>



<li><code>remove</code>：指定したバイト位置の 1 文字を削除し、<code>char</code> 型を返します。</li>



<li><code>truncate</code>：指定したバイト位置以降を削除します。返却値はありません。</li>



<li><code>clear</code>：文字列の全てを削除します。</li>
</ul>



<p class="wp-block-paragraph">各方法で、返却値の有無や型が異なっているので注意してください。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn main() {
    let mut s = String::from("HelloWorld");
    
    // pop() で末尾の文字を取得
    match s.pop() {
        Some(c) => println!("pop: {}", c),
        None => println!("文字列が空なので取り出せません"),
    }
    println!("s: {}", s);

    // remove(index) で指定バイト位置の1文字を削除
    let c = s.remove(1);
    println!("remove idx:{}, removed:{}", 1, c);
    println!("s: {}", s);

    // truncate で指定バイト位置以降を削除
    s.truncate(4);
    println!("s: {}", s);

    // 文字列を全て削除する
    s.clear();
    println!("s: {}", s);
}</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
pop: d
s: HelloWorl
remove idx:1, removed:e
s: HlloWorl
s: Hllo
s:</pre>



<p class="wp-block-paragraph">返却値の有無や型が異なっているので取り出し方がそれぞれ異なっています。なお、<code>remove</code> や <code>truncate</code> は、<code>Option</code> 型のような安全な型を返すメソッドではないため、範囲外インデックスを指定すると実行時に <code>panic</code> を引き起こし、プログラムが異常終了します。</p>



<h4 class="wp-block-heading jinr-heading d--bold"><code>insert</code>、<code>remove</code>、<code>truncate</code> はバイト位置であることに注意</h4>



<p class="wp-block-paragraph"><code>insert</code>、<code>remove</code>、<code>truncate</code> といったメソッドは、位置の指定がバイト位置となっています。そのため、マルチバイト文字を含む場合で、マルチバイト文字の途中のバイト位置を指定すると <code>panic</code> で実行時にエラーとなるので注意が必要です。</p>



<p class="wp-block-paragraph">マルチバイト文字を含む場合は、以下のように <code>char_indices()</code> メソッドを使ってバイト位置を検索してから安全に処理することが推奨されます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn main() {
    // バイト位置を指定する場合は、マルチバイト文字の時に注意
    // ===== insert の場合
    let mut s1 = String::from("Rust、こんにちは。");

    // 以下は panic となる
    // s1.insert(5, '!');

    // 文字数でバイト位置を検索してからであれば安全
    if let Some((idx, _)) = s1.char_indices().nth(10) {
        s1.insert(idx, '!');
    }
    println!("{}", s1);

    // ===== remove の場合
    let mut s2 = String::from("Rust、こんにちは。");

    // 以下は panic となる
    // s1.remove(5);

    // 文字数でバイト位置を検索してからであれば安全
    if let Some((idx, _)) = s2.char_indices().nth(4) {
        s2.remove(idx);
    }
    println!("{}", s2);

    // ===== truncate の場合
    let mut s3 = String::from("Rust、こんにちは。");

    // 以下は panic となる
    // s3.truncate(5);

    // 文字数でバイト位置を検索してからであれば安全
    if let Some((idx, _)) = s3.char_indices().nth(4) {
        s3.truncate(idx);
    }
    println!("{}", s3);
}</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
Rust、こんにちは!。
Rustこんにちは。
Rust</pre>



<p class="wp-block-paragraph">上記例でコメントアウトしたの部分を外すと <code>panic</code> で実行時にエラーとなります。例の文字列で 5 バイト目は「<code>、</code>」の途中のバイトを指すためです。</p>



<p class="wp-block-paragraph"><code>char_indices().nth(x)</code> で <code>x</code> 文字目のバイト位置を調べることができます。このメソッドは、<code>Option</code>型で位置と文字のタプルを取得でき、<code>match</code> や <code>if let</code> を使えば安全に処理できます。</p>



<h3 class="wp-block-heading jinr-heading d--bold"><code>String</code> 型の内部構造</h3>



<p class="wp-block-paragraph"><code>String</code> 型の変数は、ヒープ領域に確保されることが特徴ですが、後ほど説明する文字列スライスとの違いを明確に理解するために、内部構造を理解しましょう。<code>String</code> 型の変数は、スタック上に以下の内容を含む情報を格納しています。</p>



<ul class="wp-block-list jinr-list">
<li>ヒープアドレス上の先頭アドレス（8バイト）</li>



<li>ヒープ上で使用中のバイト数（8バイト）</li>



<li>ヒープ上で確保済のバイト数（8バイト）</li>
</ul>



<p class="wp-block-paragraph">このように <code>String</code> 型は 8 バイト × 3 の 24 バイト で構成される変数としてスタックのメモリ領域を使用します。概要イメージとしては以下のようになっており、実際の文字列はヒープ領域に格納されます。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" width="1003" height="440" src="https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-37.png" alt="String 型の内部構造" class="wp-image-877" style="width:630px;height:auto" srcset="https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-37.png 1003w, https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-37-300x132.png 300w, https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-37-768x337.png 768w" sizes="(max-width: 1003px) 100vw, 1003px" /></figure>
</div>


<p class="wp-block-paragraph">具体的に以下のコードで内部情報を確認してみます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">use std::mem;

fn main() {
    let s1 = String::from("HelloWorld");
    let s2 = String::from("Rust こんにちは！");

    println!("===========================================");
    println!("s1 の文字列の内容: {}", s1);
    println!("s1 のスタック上のアドレス: {:p}", &amp;s1);
    println!("ポインタ: {:p}", s1.as_ptr());
    println!("長さ: {}", s1.len());
    println!("容量: {}", s1.capacity());
    println!("String のサイズ（byte）: {}", mem::size_of_val(&amp;s1));
    println!("===========================================");
    println!("s2 の文字列の内容: {}", s2);
    println!("s2 のスタック上のアドレス: {:p}", &amp;s2);
    println!("ポインタ: {:p}", s2.as_ptr());
    println!("長さ: {}", s2.len());
    println!("容量: {}", s2.capacity());
    println!("String のサイズ（byte）: {}", mem::size_of_val(&amp;s2));
    println!("===========================================");
}</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
===========================================
s1 の文字列の内容: HelloWorld
s1 のスタック上のアドレス: 0xddb70ff510
ポインタ: 0x2655f95eff0
長さ: 10
容量: 10
String のサイズ（byte）: 24
===========================================
s2 の文字列の内容: Rust こんにちは！
s2 のスタック上のアドレス: 0xddb70ff528
ポインタ: 0x2655f95f2f0
長さ: 23
容量: 23
String のサイズ（byte）: 24
===========================================</pre>



<p class="wp-block-paragraph">上記例では、<code>s1</code> と <code>s2</code> という <code>String</code> 型の変数を用意し、内部の情報を調べています。</p>



<p class="wp-block-paragraph">まず、変数のスタック上のアドレス（<code>&amp;s1</code> と <code>&amp;s2</code>）は、<code>println!</code> で <code>{:p}</code> とすることで確認できます。また、<code>std::mem::size_of_val(&amp;s1)</code> により具体的なメモリ上の大きさを調べられます。 これにより、<code>String</code> 型の変数がスタック上で 24 バイトのメモリを確保していることを確認できます。</p>



<p class="wp-block-paragraph"><code>String</code> 型を構成する、ヒープ領域の先頭アドレス値は <code>as_ptr()</code> メソッド、長さは <code>len()</code> メソッド、容量は <code>capacity()</code> メソッドで確認することができます。上記例では、長さと容量が一致していますが、コンパイラが長さに対して余裕をもって確保することが多いです。</p>



<h2 class="wp-block-heading jinr-heading d--bold">文字列スライス（<code>&amp;str</code> 型）</h2>



<h3 class="wp-block-heading jinr-heading d--bold">文字列スライス（<code>&amp;str</code> 型）とは</h3>



<p class="wp-block-paragraph">Rust において、<span class="jinr-d--text-color d--marker1 d--bold">文字列スライス（<code>&amp;str</code>）</span>は、UTF-8 でエンコードされた文字列の一部または全体を参照するための型です。これは、借用（参照）型であり、データの所有権を持ちません。データの本体は静的領域やヒープ領域に存在し、&amp;str はそこへのポインタと長さを持つだけの軽量な構造を持っています</p>



<p class="wp-block-paragraph">プログラム上の文字列リテラル（例：<code>"HelloWorld"</code>）は、プログラムの静的領域に格納されており、型は <code>&amp;'static str</code> 型です。ここで、<code>'static</code> は静的なライフタイムを表しており、プログラムの開始から終了までのライフタイムを持つ型であることを示しています。</p>



<p class="wp-block-paragraph">また、<code>String</code> 型の変数は、<code>&amp;str</code> 型に暗黙的に変換することができるため、関数等で <code>&amp;str</code> 型を引数として受け取る設計にすることで、文字列リテラルでも <code>String</code> 型でも扱う関数とすることができます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">文字列スライス（<code>&amp;str</code> 型）の使い方</h3>



<p class="wp-block-paragraph"><code>&amp;str</code> 型は、以下のような状況でよく使用されます。</p>



<ul class="wp-block-list jinr-list">
<li>文字列リテラルとして使用する</li>



<li>文字列リテラルや <code>String</code> からの部分文字列として使用する</li>



<li>関数の引数として、汎用的に文字列を受け入れる</li>
</ul>



<h4 class="wp-block-heading jinr-heading d--bold">文字列リテラルとして使用</h4>



<p class="wp-block-paragraph">最も単純な使い方は、文字列リテラルとして使用する方法です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn main() {
    let s = "HelloWorld";
    println!("s: {}", s);
}</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
s: HelloWorld</pre>



<h4 class="wp-block-heading jinr-heading d--bold">文字列リテラルや <code>String</code> の部分文字列として使用する</h4>



<p class="wp-block-paragraph">文字列スライスは、スライスという名の通り、文字列リテラルや <code>String</code> の部分文字列への参照を取得することができます。文字列リテラルや <code>String</code> の <code>s</code> があった時に <code>&amp;s[開始..終了]</code> のように部分文字列の範囲を指定します。</p>



<p class="wp-block-paragraph">開始と終了はバイト位置で、終了位置の文字は含まないことに注意してください。また、開始を省略して <code>[..終了]</code> すると開始から終了位置までの文字列を、終了を省略して <code>[開始..]</code> とすると開始位置から終了までの文字列を取得できます。なお、<code>[..]</code> は文字列全体を表します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn main() {
    let s1 = "HelloWorld";
    let s2 = String::from("HelloWorld");

    let s1_part = &amp;s1[2..5];
    let s2_part = &amp;s2[5..];
    println!("s1_part: {}", s1_part);
    println!("s2_part: {}", s2_part);
}</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
s1_part: llo
s2_part: World</pre>



<p class="wp-block-paragraph">文字列スライスもバイト位置を指すことから、 <code>String</code> の注意事項と同様に、マルチバイト文字の途中のバイト位置を指定すると <code>panic</code> が発生します。事前に <code>char_indices()</code> を使用してバイト位置を確認してから処理すると安全です。 </p>



<h4 class="wp-block-heading jinr-heading d--bold">関数の引数として、汎用的に文字列を受け入れる</h4>



<p class="wp-block-paragraph">関数の引数として文字列を受け取る場合にも、<code>&amp;str</code> 型をよく使用します。<code>String</code> 型の参照は、自動で <code>&amp;str</code> へ変換されるため、以下の例では <code>String</code> の参照である <code>&amp;s2</code> についても <code>show_str</code> 関数は受け取ることができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fn show_str(s: &amp;str) {
    println!("{}", s);
}

fn main() {
    let s1 = "HelloWorld";
    let s2 = String::from("HelloWorld");

    show_str(&amp;s1);
    show_str(&amp;s2);
}</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
HelloWorld
HelloWorld</pre>



<h3 class="wp-block-heading jinr-heading d--bold">文字列スライス <code>&amp;str</code> 型の内部構造</h3>



<p class="wp-block-paragraph"><code>&amp;str</code> 型の変数は、静的領域に格納される文字列リテラル、またはヒープ領域に格納される <code>String</code> を指しています。内部構造としては、<code>&amp;str</code> 型の変数は、スタック上に以下の内容を含む情報を格納しています。</p>



<ul class="wp-block-list jinr-list">
<li>文字列が格納されている先頭アドレス（8バイト）</li>



<li>スライスのバイト数（8バイト）</li>
</ul>



<p class="wp-block-paragraph">このように <code>&amp;str</code> 型は 8 バイト × 2 の 16 バイト で構成される変数としてスタックのメモリ領域を使用します。概要イメージとしては以下のようになっており、文字列の実体は、文字列リテラルの場合は静的領域に、<code>String</code> の場合はヒープ領域に格納されます。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img decoding="async" width="1003" height="824" src="https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-38.png" alt="&amp;str 型の内部構造" class="wp-image-901" style="width:630px" srcset="https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-38.png 1003w, https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-38-300x246.png 300w, https://rust-tech.nkhn37.net/wp-content/uploads/2025/07/image-38-768x631.png 768w" sizes="(max-width: 1003px) 100vw, 1003px" /></figure>
</div>


<p class="wp-block-paragraph">具体的に以下のコードで内部情報を確認してみます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="rust" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">use std::mem;

fn main() {
    let s1 = "HelloWorld";
    let s2 = String::from("Rust こんにちは！");
    let s2_slice = &amp;s2[..];

    println!("===========================================");
    println!("s1 の文字列の内容: {}", s1);
    println!("s1 のスタック上のアドレス: {:p}", &amp;s1);
    println!("ポインタ: {:p}", s1.as_ptr());
    println!("長さ: {}", s1.len());
    println!("&amp;str のサイズ（byte）: {}", mem::size_of_val(&amp;s1));
    println!("===========================================");
    println!("s2_slice の文字列の内容: {}", s2_slice);
    println!("s2_slice のスタック上のアドレス: {:p}", &amp;s2_slice);
    println!("ポインタ: {:p}", s2_slice.as_ptr());
    println!("長さ: {}", s2_slice.len());
    println!("&amp;str のサイズ（byte）: {}", mem::size_of_val(&amp;s2_slice));
    println!("===========================================");
}</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
===========================================
s1 の文字列の内容: HelloWorld
s1 のスタック上のアドレス: 0x80d46ff2c8
ポインタ: 0x7ff61530b4f0
長さ: 10
&amp;str のサイズ（byte）: 16
===========================================
s2_slice の文字列の内容: Rust こんにちは！
s2_slice のスタック上のアドレス: 0x80d46ff2f0
ポインタ: 0x26c1d91f010
長さ: 23
&amp;str のサイズ（byte）: 16
===========================================</pre>



<p class="wp-block-paragraph">上記例では、文字列リテラルである <code>s1</code> と <code>String</code> <code>s2</code>の参照としての <code>s2_slice</code> の <code>&amp;str 型</code>で内部情報を取得して表示しています。</p>



<p class="wp-block-paragraph">上記例の <code>s1.as_ptr()</code> は静的領域を、<code>s2_slice.as_ptr()</code> はヒープ領域を指すアドレスとなっています。また、<code>std::mem::size_of_val()</code> により取得できるバイト数が 16 であることから、<code>&amp;str</code> 型のスタック上でのメモリサイズが 16 バイトであることが確認できます。</p>



<div id="nkhn3-3045368695" class="nkhn3--2 nkhn3-entity-placement" style="margin-left: auto;margin-right: auto;text-align: center;"><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9478001176347002"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-9478001176347002"
     data-ad-slot="4670569211"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></div><h2 class="wp-block-heading jinr-heading d--bold">まとめ</h2>



<p class="wp-block-paragraph">Rust で文字列を扱うための <code>String</code> と <code>&amp;str</code> の基本的な使い方と内部的な構造の違いについても詳しく説明しました。</p>



<p class="wp-block-paragraph">動的な操作には <code>String</code> を、参照だけで十分な場合は  <code>&amp;str</code> を使うなど、用途に応じた選択ができるようになることが重要です。また、各種メソッドなどについても紹介しましたが、マルチバイト文字を含む場合のバイト位置指定の扱いには十分に注意し、<code>char_indices()</code> を活用した安全な操作を心がけましょう。</p>



<p class="wp-block-paragraph">文字列操作は、どのようなプログラミング言語においても非常に重要な要素です。<code>String</code> と <code>&amp;str</code> について、基本をしっかり押さえてプログラミングできるようになりましょう。</p>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box8  "><div class="a--simple-box-title d--bold">ソースコード</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記で紹介しているソースコードについては <a href="https://github.com/nkhn37/rust-tech-sample-source/tree/main/rust-basic/string-str" target="_blank" rel="noreferrer noopener">GitHub</a> にて公開しています。参考にしていただければと思います。</p>
</div></div></section>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://rust-tech.nkhn37.net/rust-programming-basics/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://rust-tech.nkhn37.net/wp-content/uploads/2025/08/77e7c51961993fb9cb96c02a2311436d-320x180.jpg" alt="Rust プログラミング入門" /></div><div class="a--blogcard-title d--bold">Rust プログラミング入門</div></a></section><div id="nkhn3-284823707" class="nkhn3-multiplex nkhn3-entity-placement" style="margin-left: auto;margin-right: auto;text-align: center;"><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9478001176347002"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block"
     data-ad-format="autorelaxed"
     data-ad-client="ca-pub-9478001176347002"
     data-ad-slot="8958649655"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></div>]]></content:encoded>
					
					<wfw:commentRss>https://rust-tech.nkhn37.net/rust-string-str-basic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Disk: Enhanced  を使用したページ キャッシュ

Served from: rust-tech.nkhn37.net @ 2026-07-22 12:58:45 by W3 Total Cache
-->