2012-02-27 26 views
2

當它被傳遞到功能指針陣列和相關的表達式求值

這意味着在

一種陣列型衰減到指針類型
int func(int x[*p]) 

*p不應被評價爲聲明等效於int func(int *x)

指針指向數組的指針是否一樣?

下面是代碼

int *p=0; 
void func(int (*ptr)[*p]) //A 
{ 
    // code 
} 

int main() 
{ 
    int arr[5][5]; 
    func(arr); 
} 

*p//A評價的標準保證?

我嘗試過,沒有對g ++ 4.6進行優化。啓用優化後,我不會收到段錯誤。在叮噹中,即使沒有任何優化,代碼也不會給出任何段錯誤。

+0

沒有聲明'void func(int(* ptr)[* p])'和'void func(int * ptr [])'完全一樣嗎? – Bart 2012-02-27 19:52:07

+3

我不知道'void func(int x [RANDOM_STUFF])'是有效的! – 2012-02-27 20:57:54

+0

@OliCharlesworth:這不正確嗎? – 2012-02-28 03:12:37

回答

2

從C99標準節6.7.5.2組聲明,第1段:

  1. 除了可選的類型合格音響ERS和關鍵字靜態的,則[ 和]可限定表達式或*。如果它們定義了一個表達式 (它指定了一個數組的大小),表達式應該有一個整數類型 。如果該表達式是一個常量表達式,則其應該具有大於零的值。元素類型不應爲 不完整或函數類型。可選類型限定符和 關鍵字靜態只應出現在具有數組類型的函數 參數聲明中,然後僅在最外面的數組 類型派生中出現。

表達*p的計算結果爲0,不滿足上述段的要求,所以該行爲是未定義。