這個問題在這里已經有了答案: 從指標 C 獲取陣列的大小 (5 個回答) 8 小時前關閉。
所以我試圖創建一個函式,通過回傳陣列的大小和整數型別的大小來獲取陣列的長度......
代碼:
#include <cstdio>
#include <iostream>
using namespace std;
int len(int *thing) {
return sizeof(thing) / sizeof(int);
}
int main() {
int fard[] = {100, 45, 1, 723, 500};
cout << len(fard);
}
...當我運行代碼時,它只回傳 1
我該如何解決這個問題/我做錯了什么。
uj5u.com熱心網友回復:
函式引數有一個指標型別
int len(int *thing) {
return sizeof(thing) / sizeof(int);
}
即使你會像這樣重寫函式
int len(int thing[]) {
return sizeof(thing) / sizeof(int);
}
盡管如此,編譯器會將函式引數的陣列型別調整為指向第一個函式宣告中寫入的陣列元素型別的型別指標。
所以在函式中,運算式sizeof(thing)產生指標的大小。如果指標的大小等于 的值,sizeof( int )則函式回傳 1。
你可以寫
template <size_t N>
size_t len(const int ( &thing )[N] ) {
return N;
}
接著
cout << len(fard);
獲取陣列中的元素數fard。
注意在C 17std::size的頭檔案<iterator>中已經宣告了標準的C 函式。
所以你可以寫
#include <iterator>
//...
std::cout << std::size(fard);
uj5u.com熱心網友回復:
因為sizeof(thing) / sizeof(int)大概相當于4 / 4 == 1。因為thing是一個指標并且指標在 32 位編譯器上有 4 個位元組的大小。
這里:
len(fard)
當您傳遞fard 給該函式時,它會衰減為一個指標。這意味著它會丟失其大小資訊。因此,在函式內部,len您將單個指標除以sizeof(int).
uj5u.com熱心網友回復:
試試這個
#include <cstdio>
#include <iostream>
using namespace std;
template< std::size_t N >
int len(int (&thing)[N] ) {
return sizeof(thing) / sizeof(int);
}
int main() {
int fard[] = {100, 45, 1, 723, 500};
cout << len(fard);
}
結果:
Program stdout
5
代碼:https : //godbolt.org/z/qzdbqEYx1
順便說一句,在 x86_64 上,您的原始代碼回傳 2 = sizeof(64 bit pointer)/sizeof(32 bit int)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/390692.html
