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])))
これで期待通りに動きましたが、釈然としません。
なぜサイズが変わりますか?
そして変えずにすむ方法があれば教えてください。
初めての質問で、おかしなことを書いていたら済みません。