簡體   English   中英

為什么 sizeof(param_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM