プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • C言語
  • 【C言語】「ナル文字」について
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【C言語】「ナル文字」について

03.17

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

ナル文字とは?

C言語の文字列はchar型の配列になりますが、その終端文字に「ナル文字(\0)」を使います。ちなみに、コンパイラが自動で入れてくれます。

ナル文字は要は「値がゼロであるint型」と同じことになります。(\0はNULLのことを指しており、ASCIIコードの制御文字のことをさしていて実体は整数の0と同じということ。)

例

1
2
char str[4] = "abc";
['a', 'b', 'c', '\0']

というcharの配列になります。最後の「'\0'」がナル文字になります。

なお、このナル文字を意図的に消してしまった場合(上記例で言えば、str[3]="d"などと代入した場合に消えてしまいます。)はchar配列を表示させようとした場合にひたすらずっと不明なデータを読み込ませるような挙動になってしまうので注意です。

例えば、char配列をfor文で回すような以下の処理の場合にナル文字がないとエラーになってしまいます。(配列外のメモリアクセス違反が発生して異常終了します。)

1
2
3
for (i = 0;str[i] != '\0'; i++) {
   src[i];
}

また、C言語ではナル文字が終端であることを利用した関数などがありそれも異常な挙動になります。(例:printf関数)

ヌルポインタとの違いは?

ヌルポインタは、stdio.hにてマクロ定数で「0」で初期化されているので「ナル文字」と同じなのではと思うかもしれません。

実際の所は異なりますが、コンパイラの働きによって実質的には同じように動いてしまいます。

なので、例えばポインタ変数にint型の3を入れた場合はコンパイルエラーになります。

1
2
3
4
5
int main()
{
int *b;
b = 3; //コンパイルエラー
}

しかし、0を入れるとコンパイルエラーになりません。

1
2
3
4
5
int main()
{
int *b;
b = 0; //コンパイルエラーにならない。
}

要は、コンパイラが「0」という定数をヌルポインタとして特別扱いをしているのです。

処理系の違いによってもほとんど変わりません。

文字の終端にヌルポインタは使えるか?

ナル文字とヌルポインタは同じ「0」を示しているので文字の終端にヌルポインタも使えるのではないかということですが、結論から申しますと使わない方がよいでしょう。

処理系によっては、ヌルポインタは「0」以外を示すことがあるためです。(もちろん、プログラム上でヌルポインタとして使いたい場合は、普通に使えばよいと思いますが。)

スポンサーリンク
  • 2019 03.17
  • miyabisan2
  • コメントを書く
  • C言語
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2019 03.06

    【C言語】「ビルド」作業の知識と効率化について(make等)

  2. 2019 03.17

    【C言語】「配列」利用における注意点

  3. 2019 03.02

    【C言語】メモリの基本、メモリを扱う関数

  4. 2019 03.05

    【C言語】「コンパイラ」、「リンカ」の役割

  5. 2019 03.05

    【C言語】「ヘッダーファイル」、「プリプロセッサ」や「マクロ処理」について

  6. 2019 03.17

    【C言語】ポインタの基本や「ポインタ演算」、「ヌルポインタ」について

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【C言語】ポインタの基本や「ポインタ演算」、「ヌルポイ…

【マルチメディア】映像データの「種類(MPEG1など)…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー