![](/img/trans.png)
[英]Why the size differs? sizeof(a) vs sizeof(&a) of an array?
[英]Why sizeof(param_array) is the size of pointer?
我想得到一個數組的長度,比如int array[] = {1, 2, 3, 4}
。 我使用sizeof
來做到這一點。
int length(int array[])
{
return sizeof(array) / sizeof(int);
}
int main()
{
int array[] = {1, 2, 3, 4};
printf("%d\n", length(array)); // print 1
printf("%d\n", sizeof(array) / sizeof(int)); // print 4
}
那么,為什么 function length
中的sizeof(array)
返回array
的指針大小? 但是在 function main
中,它可以工作。
而且,我應該如何修改length
function 以獲得數組的長度?
一個特殊的 C 規則說,對於函數參數,數組類型被調整<\/em>為指針類型。 這意味着:
相當於
因此,當您計算
sizeof<\/code>的大小時,您實際上是在計算指針的大小。
(C99,6.7.5.3p7)“將參數聲明為“類型數組”應調整為“類型限定指針”,其中類型限定符(如果有)是在數組的 [ 和 ] 中指定的限定符類型推導。”
當您將數組傳遞給函數時,數組會衰減為指針。
"正如其他回答者所指出的,聲明為采用數組的函數的編譯方式與它采用指針的方式相同。
我見過的最常見的長度方法是使用#define,但是如果你使用模板玩技巧,你可以讓你的函數工作。
template <size_t _Size> inline int length(int(& array)[_Size])
{
//return sizeof(array) / sizeof(int);
return _Size;
};
int array[] = {1, 2, 3, 4};
printf("%d\n", length(array)); // print 4
在主程序中,編譯器知道數組的長度。 在子程序中,它沒有。 特別是,在子例程中,
int[]<\/code>類型的參數與
int *<\/code>類型的參數相同。
另一方面,在主程序中,
array<\/code>的類型為
int[4]<\/code> 。
(您可以通過嘗試為側
main<\/code>中的
array<\/code>分配另一個值來測試這一點。編譯器會抱怨。)
"
C 不使用變量存儲有關數組大小的運行時元數據。 您必須自己將其存儲在某個地方。
在方法長度<\/em>的上下文中,類型為int[]<\/em>的變量只是指向內存塊的指針。 這就是為什么大小與系統上任何其他指針的大小相同的原因。
當sizeof<\/em>在編譯時訪問數組時(如在您的main<\/em>函數中),它將返回數組占用的字節數。
如大家所說,如果您希望length
了解傳入數組的真實大小,則必須傳入該信息。 但是它有可能接收到對數組的引用,其中包含內置的信息:
int length(int n, int (* array)[n])
{
return sizeof(*array) / sizeof(int);
}
int main()
{
int array[] = {1, 2, 3, 4};
printf("%d\n", length(4, &array)); // print 1
printf("%d\n", sizeof(array) / sizeof(int)); // print 4
}
不過,我不知道這對您有什么好處,因為首先已經提供了尺寸。 但是您會看到sizeof
運算符在這種情況下按您希望的方式工作。
因為里面的可變數組長度和外面的不一樣。 您必須將 sizeof(array) \/ sizeof(int) 保留在 main 函數中。
"要修改代碼以便
length<\/code>可以獲取數組的長度,請將其轉換為宏:
#define length(x) (sizeof(x)/sizeof(*x))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.