2015-05-02 60 views
1

在C中,可以有在長度是已知的一個結構定義局部上的陣列中。術語爲陣列,其中長度是已知的C/C++

例如:

{ 
    int foo[8]; 
    assert(sizeof(foo) == sizeof(int[8])); 
    ... 

當在一個結構中使用的,陣列尺寸也是已知的。

struct MyStruct { int foo[8]; }; 
void func(struct MyStruct *mystruct) 
{ 
    assert(sizeof(mystruct->foo) == sizeof(int[8])); 

但是,當作爲參數傳遞給函數時,這相當於int *。指的是差的時候什麼術語使用 -

void func(int foo[8]) 
{ 
    assert(sizeof(foo) == sizeof(int[8])); /* will fail */ 

這當然是正確的,也值得期待,我的問題是什麼嗎?

例如,這個評論的正確完成是什麼?

/* This macro will only work correctly when ____ */ 
#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0])) 

回答

4

正如你所說,在C,一個指針數組傳遞給一個函數,所以你可以使用sizeof運營商都找不到它的大小。

的評論是錯誤的開始,它應該是:

/* This macro will only work correctly if 'a' is an array type */ 
+1

nitpick:指向數組*的第一個元素的指針* – Christoph

+0

只有當函數參數是一個指針時。問題在於它的OP代碼函數參數*是*'int *'。 – juanchopanza

+1

即使將函數參數聲明爲數組,其實際類型也是指針,而不是數組。所以sizeof將返回指針的大小。 – MByD

2

陣列衰減到時給函數傳遞指針。註釋可能是:

/* This macro will only work correctly when the array is not decayed */ 
+0

只有函數參數是指針纔會衰減。 – juanchopanza

+0

@juanchopanza:有可能有一個函數參數是一個數組嗎?,我看到數組傳遞值的唯一方法是將它們包裝到一個'struct'中。 – ideasman42

+0

@ ideasman42你可以使用其參數*是指向數組的指針的函數。 – juanchopanza

1

/*當「一」是一個完整的類型的數組 */

因爲你不能用一個不完全類型使用sizeof這個宏才能正常工作:

struct T { 
    int a; 
    int arr[]; /* Flexible array */ 
}; 

int main(void) 
{ 
    struct T x; 

    /* invalid application of ‘sizeof’ to incomplete type ‘int[]’ */  
    printf("%zu\n", ARRAY_SIZE(x.arr)); 
    return 0; 
} 
+0

任何數組都是可索引的,因爲數組訂閱是用於指針運算的糖 – Christoph

+0

@Christoph,right,edited, –

2

功能參數不能有陣列型。聲明

void func(int foo[8]) 

僅僅是

void func(int *foo) 

語法糖丟棄任何大小的信息(除了在聲明int foo[static 8]的情況下 - 類型仍然會被調整到int*,但是編譯器可以使用尺寸信息用於優化目的)。

注意的是,除了靜態已知尺寸的陣列,也有動態大小的可變長度數組和未知大小的不完整的陣列。後者只能出現在外部聲明中(因爲存儲需求未知)或者在結構中作爲靈活的數組成員。

在可變長度數組的情況下,具有sizeof在運行時進行評估,在不完全的陣列的情況下,應當編譯失敗。

所以,如果你想成爲具體的,您的評論可以寫成:

這個宏才能正確時「」具有完整的數組類型 工作,特別是沒有一個函數參數的那些有指針類型。

+1

請注意,即使你不這麼說:使用'int foo [static 8]'不會改變wrt'sizeof'的行爲。也許值得注意清晰 – ideasman42

+0

也可能值得鏈接:http://stackoverflow.com/questions/3430315/purpose-of-static-keyword-in-array-parameter-of-function – ideasman42

+0

@ ideasman42:我明確提到*類型仍然會被調整*,但是我澄清了 – Christoph