回答編集履歴

1

修正と追記

2022/08/27 01:35

投稿

thkana
thkana

スコア7639

test CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  どうしてもsizeofで配列サイズを取りたいなら、引数リストについて以下のような記述をすることはできます。
9
9
  `int size(int (*b)[200000])`
10
- そうすると、bはint200000要素の配列へのポインタということですから、`sizeof(*b)`は`sizeof(int)*100`と同じ値になります。ただし、このとき呼び出し側は`size(&a);`とする必要がありますし、呼び出し側の配列の`a[0]`にアクセスしたければ`(*b)[0]`とする必要があります。(`*b`はすなわちポインタが指している「配列」そのもの)
10
+ そうすると、bはint200000要素の配列へのポインタということですから、`sizeof(*b)`は`sizeof(int)*200000`と同じ値になります。ただし、このとき呼び出し側は`size(&a);`とする必要がありますし、呼び出し側の配列の`a[0]`にアクセスしたければ`(*b)[0]`とする必要があります。(`*b`はすなわちポインタが指している「配列」そのもの)
11
11
 
12
12
  -余談1-
13
13
  これと合わせて、C/C++では以下のような決まりがあります。
@@ -22,3 +22,7 @@
22
22
 
23
23
  -余談2-
24
24
  ローカルの自動変数はスタック領域にとられます。スタック領域は、あくまで「一時的なデータの保持」に使われる意図であるため、決して大きな領域を確保していません。まぁ、現実として今どきのWindowsやLinuxではint型200000個のデータを格納できないことはないのですが、しかしキモチとしてはそれは「スタックにとるには大きいなぁ」という気がします。
25
+
26
+ -余談3-
27
+ 「配列の先頭」と書きましたが受け取った側からすれば必ずしも「先頭」ではなくて基準点といった方がいい場合もあるかもしれません。
28
+ `char str[]="world";`があったとして、関数`func(char s[]);`の引数に`&str[3]`を渡せば関数内では`s[-1]`で呼び出し元の`str[2]`つまり'r'にアクセスできたりするので。もちろん、インデックスの範囲が有効であることはプログラマが保証しなければいけませんけれど。