.rodataとは?【結論】
まず結論です。
✔ .rodata → 読み取り専用データ(主にROMに配置)
✔ const変数や文字列リテラルが入る
✔ 書き換え不可(安全&RAM節約)
👉 「書き換えないデータをROMに置く」ための領域です。
.rodataとは何か
.rodataとは、読み取り専用(Read Only)のデータ領域です。

プログラム実行中に書き換えないデータを格納することで、
- RAM使用量の削減
- 安全性の向上
を実現します。
初心者さん.dataや.bssと何が違うんですか?



“書き換えるかどうか”が違います!
メモリ領域解説シリーズ
本記事は「メモリ領域解説」シリーズの1つです。
メモリ領域解説シリーズの全体像はこちら


何が.rodataに入るのか
代表例はこの2つです。
① const変数
const int value = 10;👉 多くの場合、.rodataに配置されます。
constの使い方についてはこちらの記事で解説しています。


② 文字列リテラル
const char* str = "hello";👉 “hello” のデータは .rodata に配置されます。
文字データの扱いについてはこちらの記事で解説しています。


重要:ポインタとデータは別
ここが理解のポイントです。
const char* str = "hello";実際の配置👇
- “hello”(文字列本体) → .rodata
- str(ポインタ変数) → .data
👉参照先と変数本体は別物



え、同じじゃないんですか?



そこが混乱ポイントなんです!
文字列は書き換えられないの?
ここで1つ疑問が出てきます。



文字列って普通に書き換えませんか?
結論から言うと、書き換えられる場合と書き換えられない場合があります。
書き換えできない例(NG)
char* str = "hello";
str[0] = 'H'; // NG(未定義動作)👉 文字列は.rodataにあるため書き換え不可
書き換えできる例(OK)
char str[] = "hello";
str[0] = 'H'; // OK👉 配列としてRAMに展開されるため書き換え可能
さらに:const配列という選択肢
const char str[] = "hello";👉 この場合
ただし書き換え不可
配列として確保(RAMに配置されることが多い)
配列として確保(RAMに配置されることが多い)
| 書き方 | 配置 | 書き換え |
|---|---|---|
char* str = "hello"; | .rodata | ❌ |
char str[] = "hello"; | RAM | ✅ |
なぜ.rodataがあるのか
理由① RAMを節約するため
書き換えないデータをRAMに置くのは無駄です。
👉 ROMに置けばRAMを消費しない
ROMとRAMの違いについてはこちらの記事で解説しています。


理由② 安全性のため
書き換え不可にすることで
- バグによる破壊防止
- 意図しない変更を防ぐ
👉 プログラムが安定する
理由③ 実行効率のため
- 初期化不要(コピーしない)
- 起動処理が軽くなる
.data / .bss / .rodata の違い
| 領域 | 初期値 | 書き換え | 主な配置 |
|---|---|---|---|
| .data | あり | 可 | RAM(初期値はROM) |
| .bss | なし | 可 | RAM |
| .rodata | あり | 不可 | ROM |
👉 まとめると
- 書き換える → .data / .bss
- 書き換えない → .rodata
👉 .data / .bssについてはこちらで詳しく解説しています


実務での使い分け
👉 基本ルール
- 書き換えない →
const char* - 書き換える →
char[] - 配列として保持したい →
const char[
注意点(実務)
① constでもRAMに配置される場合がある
環境によっては
- constでもRAMにコピーされる
- 最適化で配置が変わる
👉 必ず.rodataとは限らない
② 文字列を書き換えると未定義動作
char* str = "hello";
str[0] = 'H'; // NG👉 .rodataは読み取り専用
👉 書き換えるとクラッシュの可能性あり
よくある誤解
「const=絶対ROM」ではない
👉 コンパイラ・設定・マイコン依存
「char* = “文字列” は安全」
👉 実は危険(書き換え不可領域)
まとめ
✔ .rodataは読み取り専用領域
✔ constや文字列が配置される
✔ RAM節約と安全性向上のために存在
👉 最重要ポイント
「書き換えないデータはROMに置く、それが.rodata」
この記事が参考になった方へ
メモリ領域については他の記事でも解説しています。


またconstの使い方など.rodataにかかわるC言語の文法についても当サイトでは解説しています。


技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。
小さなご相談からでもお気軽にご連絡ください。









コメント