C言語の引数に配列を渡したいが上手くいかない
Q&A
Closed
解決したいこと
C言語を始めたのですが、配列に対する処理が全然ないので困っています。
で、JavaScriptのlengthみたいなのが欲しいなと思って検索したら・・・、
sizeof(arr) / sizeof(arr[0])で配列の要素数が得られることが分かりました。
しかし、配列を関数に渡して、内部で上の処理を書くと上手くいきません。
sizeof(arr) の値が小さくなります。
発生している問題・エラー
//↓これは問題ありません
int main() {
  int arr[] = {1, 2, 3, 4, 5};
  int arrsize = sizeof(arr); // ← 20
  printf("%d", arrsize);
  return 0;
}
// arrsizeは20です。
// ↓ しかし配列を関数に渡すとarrsizeが小さくなってしまいます。
int length(int *arr) {
  int arrsize = sizeof(arr); // ← 4
  printf("%d", arrsize);
}
// 引数を経由するとarrsizeが4になってしまいます。
↓ 実際はこんな感じです。
int length(int *arr) {
  return sizeof(arr) / sizeof(arr[0]);
}
int main() {
  int arr[] = {1, 2, 3, 4, 5};
  int len1 = sizeof(arr) / sizeof(arr[0]);
  int len2 = length(arr); // ★
  printf("%d", len1); //=> 5
  printf("%d", len2); //=> 1
  return 0;
}
★のように、関数を通すと値がおかしくなるのです。
sizeof(arr)の値が変わるので。
自分で試したこと
仕方がないので、関数マクロにしました。
#define length(arr) ((sizeof(arr)) / (sizeof(arr[0])))
これで期待通りに動きましたが、釈然としません。
なぜサイズが変わりますか?
そして変えずにすむ方法があれば教えてください。
初めての質問で、おかしなことを書いていたら済みません。