質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

9146閲覧

Javaの配列にも列の最後に\0は入りますか?

tesllaria

総合スコア13

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/11/19 01:47

編集2016/11/19 01:48

ふと思ったことです

Cの配列には最後に\0(ナル文字)が入るのは知っているんですが、Javaの配列にも最後に\0は入りますか?

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

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

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

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

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

guest

回答4

0

ベストアンサー

ご質問の意図がちょっとわからないので、見当違いかもしれませんが回答します。

一般に、C言語で書かれたプログラムの中でメモリ領域を新たに確保したときに、その領域が初期化されているとは限りません。多くのオペレーティングシステムでは、確保した領域に何が入っているかは予測不能です。ですから、最後に'\0'が入っているとは言えません

一方で、プログラム中に現れる定数値は、コンパイル時に初期化されたメモリ領域が定義されます。このうちchar型の配列の定数 (つまり文字列) は、'\0'で終端された形式に初期化されます。これ以外の配列の定数は、明記しない限り'\0'で終端されたりはしません。たとえば、

lang

1char s1[] = "QWER"; 2char s2[] = {'Q', 'W', 'E', 'R'}; 3

では、コンパイルした結果確保されるメモリ領域は、それぞれ

投稿2016/11/19 05:27

編集2016/11/19 05:42
ikedas

総合スコア4317

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

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

tesllaria

2016/11/19 07:53

Cには文字列だとナル文字が明記されるんですね。 ならJavaの文字列を使ったプログラミングでナル文字の概念を意識しなくていいんですね。 勉強になりました、ありがとうございます。
guest

0

java の場合、ローカル変数は初期化されません。
ローカルでない変数は、明示的に初期化しなければ 数値なら0、booleanならfalse、
参照型ならnullで初期化されます。「最後だけ」ではなく、すべての要素が初期化されます。

Cの配列には最後に\0(ナル文字)が入る

これは、誤りです。最後に \0 が入るのは文字列の場合です。
配列の場合、それが静的なら 0 で初期化されます。動的なら 不定 です。
際列の最後に\0を入れたければ、プログラマーが明示的に入れなければなりません。

投稿2016/11/19 04:50

nob.

総合スコア711

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

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

退会済みユーザー

退会済みユーザー

2016/11/19 05:04

javaではローカル変数でもクラス変数でも配列の場合は確保まで行うと初期化されます
guest

0

Cでは配列のサイズは常にわかるわけではなく「未知」な場合があります。システムでのサポートは限られた文脈でのみsizeofで求められるだけであり、特に関数間で引き渡す際にはT[]T*とほぼ同じものとして扱われてしまいます。こういう背景があるため配列の大きさを扱うには大きさを別の変数として管理するか、配列の末尾に特別なマーカーデータを置くなどの方法を採らざるを得ません。文字列をcharの配列として表現するCでは後者の方法を採用しマーカーデータとしてナル文字を使うことにしました。太古の昔に制定された文字コードではNUL文字(文字コード=0x00)は「何もない文字」という意味合いがあったからなのだと思います。

一方Javaではご存知のようにポインターはなく任意の配列T[]は「配列」としてしか扱われません(Cに馴染みがない方には意味不明な説明ですが...)。T[]は正確な大きさがlengthでいつでも参照できるようになっています。こういった背景があるため文字列の終端を表す目的でナル文字のようなマーカーデータを用いる必然性がなくそうする習慣もありませんし実際入ってもいません。

Cで"abc"と記述した場合に実際の大きさが4で最後にナル文字が入るといった仕様はJavaにはなく、Javaで"abc"と記述した場合は(char[]ではなくStringになりますが)Stringの内部にあるchar[]の大きさは4ではなく3であって4文字目にナル文字が入る余地も必要もないのです。

なお実際は文字配列を確保すると全ての要素がナル文字で初期化されますがそれは文字列の終端をナル文字で表すからではなくプログラムの実行結果の再現性を確保するために何か決まった文字で初期化するという意味合いだと思います。


追記:
yohhoyさんからご指摘があり誤解を招いた部分が「一般に未知」「T[]T*とほぼ同じ」という表現だと思ったので表現を改めました。要するに自分のいいたかったことはランタイム情報にサイズ情報を含んでいないので「常にサイズがわかることが保証されていない」という点でした。

投稿2016/11/19 06:36

編集2016/11/19 11:32
KSwordOfHaste

総合スコア18394

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

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

tesllaria

2016/11/19 07:48

なるほど… ポインターじゃないJavaは「配列」としか扱われないんですね… 勉強になりました!
yohhoy

2016/11/19 07:58

C言語側の配列とポインタの説明に致命的な誤りがあります。Cの配列型(char a[10];など)はそれ自身にサイズ情報を含んでいます。配列型からポインタ型に暗黙変換される話(例:char* p = a;)と、ポインタがさす先の配列情報を(ポインタ型経由で)取得できない話(例:sizeof(p)!=10)を混同されています。
KSwordOfHaste

2016/11/19 09:38

ご指摘ありがとうございます。よく見直すと確かに誤解を招きそうな表現がありました。自分はC,Javaのメカニズムについてはよく理解しているつもりなのですが表現が下手なのは認めざるを得ません。見た人が誤解を招く表現を無くすために可能な限り訂正します。
guest

0

配列の宣言・確保まで行うと
byte,short,int,longには0
float,doubleには0.0
char には\u0000(0)がそれぞれ入りますが
最後の一つだけという事ではなく全部の添字について入っているし、
その最後の部分が使えないという事はありません

投稿2016/11/19 02:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問