前言
一般要在 C 或 C++ 中測量陣列的大小通常會使用 sizeof()
方法。以下範例分別在主程式 main 量測與呼叫自定義函式傳入陣列並量測大小。
#include <iostream>
using namespace std;
void findSize(int arr[])
{
cout << sizeof(arr) << endl;
}
int main()
{
int a[10];
cout << sizeof(a) << " ";
findSize(a);
return 0;
}
輸出結果:
40 8
明明都是對同一個陣列大小長度 10 的 int 陣列進行量測為何兩邊算出來的數值會不同。其實正確答案是 40 沒錯(4*10),因為 int64_t 在系統中佔有 4 bytes。而呼叫函式計算 sizeof 回傳 8 的原因是,在 x64 系統中指標是 8 bytes。
從這點就可以發現自定義函式 findSize(int arr[])
傳遞其實是指標的形式,因此實際上等同於 findSize(int *arr)
。這也就是為何在函式中會被計算成 8 bytes,因為傳入了一個指標位置。
如何在函式正確計算陣列大小
我們可以傳遞 reference 到陣列中。並使用 C++ 的樣板 templates。
#include <iostream>
using namespace std;
template <size_t n>
void findSize(int (&arr)[n])
{
cout << sizeof(int) * n << endl;
}
int main()
{
int a[10];
cout << sizeof(a) << " ";
findSize(a);
return 0;
}
輸出結果:
40 40
我們也可以撰寫通用的樣板,使得傳入的型態可以不受限。
#include <iostream>
using namespace std;
template <typename T, size_t n>
void findSize(T (&arr)[n])
{
cout << sizeof(T) * n << endl;
}
int main()
{
int a[10];
cout << sizeof(a) << " ";
findSize(a);
float f[20];
cout << sizeof(f) << " ";
findSize(f);
return 0;
}
輸出結果:
40 40
80 80
Reference
鼓勵持續創作,支持化讚為賞!透過下方的 Like 拍手👏,讓創作者獲得額外收入~
版主10在2020年首次開設YouTube頻道,嘗試拍攝程式教學。想要了解更多的朋友歡迎關注我的頻道,您的訂閱就是最大的支持~如果想學其他什麼內容也歡迎許願XD
https://www.youtube.com/channel/UCSNPCGvMYEV-yIXAVt3FA5A
https://www.youtube.com/channel/UCSNPCGvMYEV-yIXAVt3FA5A