C言語 .rodataとは?const変数・文字列の配置とROM/RAMの関係を実務目線で解説

目次

.rodataとは?【結論】

まず結論です。

✔ .rodata → 読み取り専用データ(主にROMに配置)
✔ const変数や文字列リテラルが入る
✔ 書き換え不可(安全&RAM節約)

👉 「書き換えないデータをROMに置く」ための領域です。


.rodataとは何か

.rodataとは、読み取り専用(Read Only)のデータ領域です。

.rodataはROMに配置される

プログラム実行中に書き換えないデータを格納することで、

  • RAM使用量の削減
  • 安全性の向上

を実現します。


初心者さん

.dataや.bssと何が違うんですか?

エンジニアくん

“書き換えるかどうか”が違います!


メモリ領域解説シリーズ

本記事は「メモリ領域解説」シリーズの1つです。

メモリ領域解説シリーズの全体像はこちら

何が.rodataに入るのか

代表例はこの2つです。


① const変数

C
const int value = 10;

👉 多くの場合、.rodataに配置されます。

constの使い方についてはこちらの記事で解説しています。


② 文字列リテラル

C
const char* str = "hello";

👉 “hello” のデータは .rodata に配置されます。

文字データの扱いについてはこちらの記事で解説しています。


重要:ポインタとデータは別

ここが理解のポイントです。

C
const char* str = "hello";

実際の配置👇

  • “hello”(文字列本体) → .rodata
  • str(ポインタ変数) → .data

👉参照先と変数本体は別物


初心者さん

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

エンジニアくん

そこが混乱ポイントなんです!


文字列は書き換えられないの?

ここで1つ疑問が出てきます。

初心者さん

文字列って普通に書き換えませんか?

結論から言うと、書き換えられる場合と書き換えられない場合があります。


書き換えできない例(NG)

C
char* str = "hello";
str[0] = 'H';  // NG(未定義動作)

👉 文字列は.rodataにあるため書き換え不可


書き換えできる例(OK)

C
char str[] = "hello";
str[0] = 'H';  // OK

👉 配列としてRAMに展開されるため書き換え可能


さらに:const配列という選択肢

C
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とは限らない


② 文字列を書き換えると未定義動作

C
char* str = "hello";
str[0] = 'H';  // NG

👉 .rodataは読み取り専用
👉 書き換えるとクラッシュの可能性あり


よくある誤解

「const=絶対ROM」ではない

👉 コンパイラ・設定・マイコン依存


「char* = “文字列” は安全」

👉 実は危険(書き換え不可領域)


まとめ

✔ .rodataは読み取り専用領域
✔ constや文字列が配置される
✔ RAM節約と安全性向上のために存在


👉 最重要ポイント

「書き換えないデータはROMに置く、それが.rodata」

この記事が参考になった方へ

メモリ領域については他の記事でも解説しています。

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

技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。

小さなご相談からでもお気軽にご連絡ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

組み込みソフトエンジニアとして働きながら、
C言語・メモリ・ポインタなどの基礎から実務まで解説しています。

副業・キャリアについても実体験ベースで発信中です。

X(旧Twitter)でも発信しています
👉 Xはこちら

▼まずはここから読むのがおすすめ
C言語文法シリーズ
メモリ領域解説シリーズ

コメント

コメントする


目次