回答編集履歴
5
typo修正T\*\*->T\*
test
CHANGED
@@ -18,4 +18,4 @@
|
|
18
18
|
|
19
19
|
追記:
|
20
20
|
|
21
|
-
yohhoyさんからご指摘があり誤解を招いた部分が「一般に未知」
|
21
|
+
yohhoyさんからご指摘があり誤解を招いた部分が「一般に未知」「`T[]`が`T*`とほぼ同じ」という表現だと思ったので表現を改めました。要するに自分のいいたかったことはランタイム情報にサイズ情報を含んでいないので「常にサイズがわかることが保証されていない」という点でした。
|
4
誤解を招く表現を訂正
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Cでは配列のサイズは常にわかるわけではなく「未知」な場合があります。システムでのサポートは限られた文脈でのみ`sizeof`で求められるだけです
|
1
|
+
Cでは配列のサイズは常にわかるわけではなく「未知」な場合があります。システムでのサポートは限られた文脈でのみ`sizeof`で求められるだけであり、特に関数間で引き渡す際には`T[]`が`T*`とほぼ同じものとして扱われてしまいます。こういう背景があるため配列の大きさを扱うには大きさを別の変数として管理するか、配列の末尾に特別なマーカーデータを置くなどの方法を採らざるを得ません。文字列をcharの配列として表現するCでは後者の方法を採用しマーカーデータとしてナル文字を使うことにしました。太古の昔に制定された文字コードではNUL文字(文字コード=0x00)は「何もない文字」という意味合いがあったからなのだと思います。
|
2
2
|
|
3
3
|
|
4
4
|
|
@@ -18,8 +18,4 @@
|
|
18
18
|
|
19
19
|
追記:
|
20
20
|
|
21
|
-
yohhoyさんからご指摘があり誤解を招いた部分が「一般に未知」という表現だと思ったので「未知の場合がある」に改めました。「一般に(どんな場合でも)分かるとは限らない」と言おうとしたのですが表現が不適切でした。
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
yohhoyさんが
|
21
|
+
yohhoyさんからご指摘があり誤解を招いた部分が「一般に未知」という表現と「T[]がT**とほぼ同じ」だと思ったので表現を改めました。要するに自分のいいたかったことはランタイム情報にサイズ情報を含んでいないので「常にサイズがわかることが保証されていない」という点でした。
|
3
補足
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Cでは配列のサイズは
|
1
|
+
Cでは配列のサイズは常にわかるわけではなく「未知」な場合があります。システムでのサポートは限られた文脈でのみ`sizeof`で求められるだけです。それは`T[]`が`T*`とほぼ同じものとして扱われるからです。こういう背景があるため配列の大きさを扱うには大きさを別の変数として管理するか、配列の末尾に特別なマーカーデータを置くなどの方法を採らざるを得ません。文字列をcharの配列として表現するCでは後者の方法を採用しマーカーデータとしてナル文字を使うことにしました。太古の昔に制定された文字コードではNUL文字(文字コード=0x00)は「何もない文字」という意味合いがあったからなのだと思います。
|
2
2
|
|
3
3
|
|
4
4
|
|
@@ -11,3 +11,15 @@
|
|
11
11
|
|
12
12
|
|
13
13
|
なお実際は文字配列を確保すると全ての要素がナル文字で初期化されますがそれは文字列の終端をナル文字で表すからではなくプログラムの実行結果の再現性を確保するために何か決まった文字で初期化するという意味合いだと思います。
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
---
|
18
|
+
|
19
|
+
追記:
|
20
|
+
|
21
|
+
yohhoyさんからご指摘があり誤解を招いた部分が「一般に未知」という表現だと思ったので「未知の場合がある」に改めました。「一般に(どんな場合でも)分かるとは限らない」と言おうとしたのですが表現が不適切でした。
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
yohhoyさんがおっしゃりたいことは配列のサイズがわからないというのは間違いという意味だと思います。そのとおりなのですが、自分のいいたかったことはランタイム情報にサイズ情報を含んでいないので「常にサイズがわかることが保証されていない」という点だったのです。
|
2
表現変更
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
一方Javaではご存知のようにポインターはなく任意の配列`T[]`は「配列」としてしか扱われません(C
|
5
|
+
一方Javaではご存知のようにポインターはなく任意の配列`T[]`は「配列」としてしか扱われません(Cに馴染みがない方には意味不明な説明ですが...)。`T[]`は正確な大きさが`length`でいつでも参照できるようになっています。こういった背景があるため文字列の終端を表す目的でナル文字のようなマーカーデータを用いる必然性がなくそうする習慣もありませんし実際入ってもいません。
|
6
6
|
|
7
7
|
|
8
8
|
|
1
誤記訂正
test
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
|
8
8
|
|
9
|
-
|
9
|
+
Cで"abc"と記述した場合に実際の大きさが4で最後にナル文字が入るといった仕様はJavaにはなく、Javaで"abc"と記述した場合は(char[]ではなくStringになりますが)Stringの内部にあるchar[]の大きさは4ではなく3であって4文字目にナル文字が入る余地も必要もないのです。
|
10
10
|
|
11
11
|
|
12
12
|
|