2015-01-01 78 views
2

我想將數組傳遞給C中的函數,並遍歷它。我有這樣的代碼:C:將數組傳遞給函數,並在接收函數中迭代

#include <stdio.h> 

int funct(int * a); 

int main(int argc, char ** argv){ 
    int a[5] = {0}; 
    int b[5] = {1, 1}; 

    printf("Size of cache: %d\n", sizeof(a)); 
    printf("Array values:\n"); 
    printf("Numb of elments in a[]: %d\n", (sizeof(a)/sizeof(a[0]))); 

    for(int i = 0; i < (sizeof(a)/sizeof(a[0])); i++){ 
     printf("for loop\n"); 
     printf("%d\n", a[i]); 
    } 
    printf("\n"); 

    printf("Size of cache: %d\n", sizeof(b)); 
    printf("Array values:\n"); 
    printf("Numb of elments in a[]: %d\n", (sizeof(b)/sizeof(b[0]))); 

    for(int i = 0; i < (sizeof(b)/sizeof(b[0])); i++){ 
     printf("for loop\n"); 
     printf("%d\n", b[i]); 
    } 
    printf("\n"); 

    funct(a); 
    funct(b); 

    return 0; 
} 

int funct(int * a){ 

    printf("Size of cache: %d\n", sizeof(a)); 
    printf("Numb of elements in a[]: %d\n", (sizeof(a)/sizeof(a[0]))); 
    printf("Array values:\n"); 

    for(int i = 0; i < (sizeof(a)/sizeof(a[0])); i++){ 
     printf("sizeof(a): %d\n",sizeof(a)); 
     printf("sizeof(a[0]): %d\n",sizeof(a[0])); 
     printf("for loop\n"); 
     printf("%d\n", a[i]); 
    } 
    printf("\n"); 

    return 0; 
} 

結果是:

Size of cache: 20 
Array values: 
Numb of elments in a[]: 5 
for loop 
0 
for loop 
0 
for loop 
0 
for loop 
0 
for loop 
0 

Size of cache: 20 
Array values: 
Numb of elments in a[]: 5 
for loop 
1 
for loop 
1 
for loop 
0 
for loop 
0 
for loop 
0 

Size of cache: 4 
Numb of elements in a[]: 1 
Array values: 
sizeof(a): 4 
sizeof(a[0]): 4 
for loop 
0 

Size of cache: 4 
Numb of elements in a[]: 1 
Array values: 
sizeof(a): 4 
sizeof(a[0]): 4 
for loop 
1 

請解釋爲什麼我不能在函數內部陣列上迭代 - 我究竟做錯了(我)以及如何正確(ii)。謝謝

+0

[C sizeof a passed array]的可能重複(http://stackoverflow.com/questions/5493281/c-sizeof-a-passed-array) – juanchopanza

回答

3

因爲sizeof運營商是給你一個指針的大小,而不是元素的數組中算你應該寫你的函數類似這樣的

int funct(int * a, int count){ 

    printf("Size of cache: %d\n", sizeof(a)); 
    printf("Numb of elements in a[]: %d\n", (sizeof(a)/sizeof(a[0]))); 
    printf("Array values:\n"); 

    for(int i = 0; i < count; i++){ 
     printf("sizeof(a): %d\n",sizeof(a)); 
     printf("sizeof(a[0]): %d\n",sizeof(a[0])); 
     printf("for loop\n"); 
     printf("%d\n", a[i]); 
    } 
    printf("\n"); 

    return 0; 
} 

然後在main()函數調用

funct(a, sizeof(a)/sizeof(a[0])); 
funct(b, sizeof(b)/sizeof(b[0])); 

你不能得到一個指針指向的元素的數量,所以唯一的方法是把它作爲函數參數和數組一起傳遞。

另請注意,您沒有正確初始化數組,並且在嘗試打印數組元素時會出現未定義的行爲。

+0

謝謝,我會接受這個答案:) ...數組未被正確初始化,因爲它僅用於試用,而不是生產代碼:) –

3

sizeof(a)將給指針的大小,而不是數組通過,因爲a是函數funct中的指針。

+2

它比這更簡單。函數參數'a' *是一個指針。因此'sizeof(a)'是該指針的大小。 – juanchopanza

2

的函數原型爲

int funct(int * a) 

其中,aint *。然後,當你通過陣列amain(),它將腐朽funct()指針。因此,funct()中的sizeof(a)只會給你指針的大小。

爲了滿足您的要求,您還必須從main()傳遞大小。

+0

'sizeof(a)'是指針的大小,因爲'a'是一個指針。 – juanchopanza

+0

@juanchopanza是的,絕對。 –

+0

我的觀點是數組衰減與爲什麼'sizeof(a)'給出指針大小無關。 – juanchopanza