ふと思ったことです
Cの配列には最後に\0(ナル文字)が入るのは知っているんですが、Javaの配列にも最後に\0は入りますか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア4317
0
java の場合、ローカル変数は初期化されません。
ローカルでない変数は、明示的に初期化しなければ 数値なら0、booleanならfalse、
参照型ならnullで初期化されます。「最後だけ」ではなく、すべての要素が初期化されます。
Cの配列には最後に\0(ナル文字)が入る
これは、誤りです。最後に \0 が入るのは文字列の場合です。
配列の場合、それが静的なら 0 で初期化されます。動的なら 不定 です。
際列の最後に\0を入れたければ、プログラマーが明示的に入れなければなりません。
投稿2016/11/19 04:50
総合スコア711
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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総合スコア18394
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/19 07:48
2016/11/19 07:58
2016/11/19 09:31
2016/11/19 09:38
0
配列の宣言・確保まで行うと
byte,short,int,longには0
float,doubleには0.0
char には\u0000(0)がそれぞれ入りますが
最後の一つだけという事ではなく全部の添字について入っているし、
その最後の部分が使えないという事はありません
投稿2016/11/19 02:21
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/19 07:53