2014-11-08 15 views
-3

我寫這樣一個功能:C程序數組作爲參數

void func1(char chx[], int y) 
    { 
    int wsn = 0; 

    wsn = *(int *) (&chx[2]); 
    if (wsn == 0) { 
    ... 
    } 
} 

編譯器工作良好,沒有警告,沒有錯誤。但是當代碼運行時,似乎會得到一個野指針。代碼崩潰了。

想知道它爲什麼會崩潰

+1

編譯所有警告和調試信息。使用調試器來了解發生了什麼。這取決於你的'func1'被調用的方式,以及編譯器,優化,處理器和ABI。也許是對齊問題。 – 2014-11-08 12:20:07

+2

因爲1.指針不是數組,2.數組不是指針,3.這違反了嚴格的別名規則,因此它具有UB。 – 2014-11-08 12:20:17

+2

@BasileStarynkevitch此外,'chx'是一個指針,所以'&chx!= chx'。 – 2014-11-08 12:20:43

回答

1

當傳遞給函數時,數組衰減到指針。這意味着在func1變量chx是一個指針,所以&chx給你一個指針指針。

解決方法:不要使用地址 - 運算符&

+0

謝謝,我對數組感到困惑,認爲數組可以得到數組地址。 – cssam 2014-11-08 12:33:47

+0

@cssam它可以,但'chx'是一個指針,而不是一個數組。 – 2014-11-08 13:56:18

+0

對不起,我再次檢查了我的代碼,用法如下:wsn = *(int *)(&chx [2]);不是wsn = *(int *)(&chx); – cssam 2014-11-08 22:46:07