🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

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

Q&A

解決済

1回答

6830閲覧

c言語 intの配列のヌル文字について

Meitei

総合スコア6

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

配列

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

0グッド

0クリップ

投稿2019/12/21 01:53

疑問 

charの配列(piyo[])ではヌル文字を最後に入れるが、intの配列(hoge[])ではヌル文字は入れないのになぜ最後のヌル文字分が空いているのかがわからないです。
該当のソースコードで

piyo[0] = 'p'
piyo[1] = 'i'
piyo[2] = 'y'
piyo[3] = 'o'
piyo[4] = '\0'

hoge[0] = 0
hoge[1] = 1
hoge[2] = 2
hoge[3] = 3
hoge[4] =(不定値) <- ヌル文字用?

となっているが
sizeof(piyo) = 5 <- 4文字 + ヌル文字
sizeof(hoge) = 16
つまりhoge[0]~hoge[3]のint4つ分でhoge[4]が含まれていない
hoge[4]はいったい何のためにあるのかが知りたいです
あとなぜヌル文字が%cで表示できないのかも知りたいです。
お願いします。

該当のソースコード

c

1#include <stdio.h> 2#include <stddef.h> 3 4int main(void) 5{ 6 int hoge[4] = {0, 1, 2, 3}; 7 size_t hoge_size = sizeof(hoge); 8 printf("hoge size is %lu\n", hoge_size); 9 10 int i; 11 for (i = 0; i < (sizeof(hoge)/sizeof(int) + 1); i++) 12 printf("hoge[%d] is %d\n", i, hoge[i]); 13 14 char piyo[] = "piyo"; //= {'p', 'i', 'y', 'o', '\0'}; 15 size_t piyo_size = sizeof(piyo); 16 printf("piyo size is %lu\n", piyo_size); 17 18 for (i = 0; i < sizeof(piyo)/sizeof(char); i++) 19 printf("piyo[%d] is %c\n", i, piyo[i]); 20 21 return 0; 22}

結果

hoge size is 16
hoge[0] is 0
hoge[1] is 1
hoge[2] is 2
hoge[3] is 3
hoge[4] is -979911936
piyo size is 5
piyo[0] is p
piyo[1] is i
piyo[2] is y
piyo[3] is o
piyo[4] is

補足情報

コンパイラー:gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)
OS: Windows10 / Windows Subsystem for Linux (Ubuntu 7.4.0)

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

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

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

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

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

Zuishin

2019/12/21 02:04

hoge[4] と宣言されているので、hoge[0] hoge[1] hoge[2] hoge[3] の 4 つです。hoge[4] はありません。
Meitei

2019/12/21 02:10

配列の宣言と添え字演算子の使い方をごっちゃまぜにしてました。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2019/12/21 02:46

答えは出てそうなので捕捉。 C言語のchar配列は文字列を表す関係からそのような仕様になっています。 printf("%s", piyo); のように、長さを別途渡さずに使用できます。 対してint型などは-2^31~-2^31-1までの値をフルに使っているので、終端文字に当たる値がありません。 どちらかというとchara配列の方が特別な例と考えてください。 今回の場合配列長はhogeだと4(indexが3まで)で、piyoだと5(indexが4までで、最後が終端文字)になります。 (※厳密にはC言語のint型のサイズは言語的には4byteと決まっていませんが例外が稀なため4byteとして説明しました)
guest

回答1

0

ベストアンサー

文字列というのは、終端用に\0を入れる、と決められているだけで、、int配列にそういう話はありませんよ

まあ、0を入れたければご自由にどうぞとしか言えませんが。

んで、

int hoge[4] = {0, 1, 2, 3};

と定義されてるなら、hoge[4]はアクセス違反となります

投稿2019/12/21 01:58

編集2019/12/21 02:02
y_waiwai

総合スコア88038

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

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

Meitei

2019/12/21 02:09

てっきり配列には¥0が必須と思ってました。ありがとうございます。
SaitoAtsushi

2019/12/21 04:35

C では配列を「配列の先頭要素を指すポインタ」で扱うことがあるので、そうなると配列の大きさの情報が抜け落ちます。 単に printf で文字列を表示しようとするだけでもどこまで表示すれば良いのかわかりません。 そこで '\0' に遭遇したらそこで終わりという意味ということにしようという習慣で統一しました。 そのような、終端を表す特別な値のことをプログラミング用語では「番兵」と呼んでいます。 https://ja.wikipedia.org/wiki/%E7%95%AA%E5%85%B5 ゼロは文字としては意味がないので文字列の終端に使うにはちょうどよいですが、 int の配列でゼロが現れるのは普通にあることですから特別な意味を持たせられません。 ご自身のプログラムで配列に入れる値の性質として現れない値なら何でも番兵に出来ますし、それがゼロであってもかまいませんが、言語として統一したものはありません。 char の配列以外の配列では、終端を表す値を入れるのではなく別途長さを受け渡しする形にすることが多いですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問