2013-02-23 54 views
0

我傳遞一個數組int與4個元素到一個函數和sizeof(array)/sizeof(array[0])說我有更少的元素。詮釋int數組通過收縮

這裏的例子發生的事情的:

int 
main() { 
    // declaring literal array 
    int array[] = {1,2,3,5}; 

    // prints 16/4 (correct output for 4 elements) 
    printf("%d/%d\n", sizeof(array), sizeof(array[0])); 

    function(array); 

    return 0; 
} 

void 
function(int array[]) { 
    // printing 8/4 instead of 16/4 
    printf("%d/%d\n", sizeof(array), sizeof(array[0])); 
} 
+0

與所有的編輯,我想知道(一) (*)*原始*問題發生了什麼,(b)'matrix_transposition_key'聲明在哪裏?原來的問題在'function()'的printf中使用'array []',這不會,甚至不會編譯。 – WhozCraig 2013-02-23 22:00:15

+1

您不能將數組傳遞給函數或從函數返回它們;他們降級到指向他們的第一個元素。 – 2013-02-23 22:02:33

+0

對不起,重寫了一些代碼來泛化和複製/粘貼printf語句。我會編輯修復 – 2013-02-23 22:09:26

回答

4

這裏的問題是函數參數是數組被編譯器轉換成指針。所以,這是因爲如果你的函數有簽名

void function(int *array); 

這意味着兩件事情:

  1. 你必須明確地傳遞數組的大小作爲另一個參數,既然已經「丟失」。
  2. sizeof(array)只會告訴你指針在你的架構中的大小。所以通過你的輸出,我們可以知道你正在編譯一個64位的目標,但沒有別的。

注意sizeof(array[0])相當於sizeof(*array)(指針運算),所以它還是會給予正確的值不管是什麼。

+0

謝謝,我會通過大小作爲參數。 – 2013-02-23 22:03:23

+0

還要注意,雖然這很可能是問題,但是發佈的代碼在它的'printf()'中不會使用該參數;它使用'main()'中使用的未知全局。如果他們打印出不同的結果,那麼*會是一個謎。 – WhozCraig 2013-02-23 22:04:42

1

函數內部的的sizeof返回的sizeof指向您的陣列可以是取決於你的系統4或8。

+0

或2,如果你在一個16位系統:) – SecurityMatt 2013-02-23 22:00:17

1

將數組作爲I/P參數傳遞給函數時,它將被視爲包含其基址的指針。

給你:的sizeof(指針)/的sizeof(數組的第一個元素)

在GDB:(內部函數())

(gdb) pt matrix_transposition_key                
type = int *                      
(gdb) pt matrix_transposition_key[0]             
type = int 

(gdb) p sizeof(matrix_transposition_key) 
$2 = 8                       
(gdb) p sizeof(matrix_transposition_key[0])              
$3 = 4