2014-10-09 90 views
1

我不明白爲什麼我的程序只打印數組中的第一個數字。 它似乎只循環一次,然後東西打破循環。輸出是232數組的總和

#include <stdio.h> 

int main(int argc, char* argv[]){ 
int sum_arr(int arr[]); 
int arr[5]={232,44,3,4,5}; 
printf("%d\n",sum_arr(arr)); 

return 0; 
} 

sum_arr(int arr[]){ 
    int i,sum=0,sizeofarr=sizeof(arr)/sizeof(arr[0]); 
    for(i=0;i<=(sizeofarr-1);i++){ 
    sum+=arr[i]; 
    } 
    return (sum); 
} 
+0

隱含'int'因爲C99不支持。不要再使用它了。 – 2014-10-09 10:17:37

回答

2

更改代碼如下方式

#include <stdio.h> 

nt main(int argc, char* argv[]) 
{ 
    int sum_arr(int arr[], size_t n); 
    int arr[5] = { 232, 44, 3, 4, 5 }; 

    printf("%d\n", sum_arr(arr, sizeof(arr)/sizeof(*arr))); 

    return 0; 
} 


    int sum_arr(int arr[], size_t n) 
    { 
     int i = 0, sum = 0; 

     for (; i < n ;i++) 
     { 
      sum += arr[i]; 
     } 

     return (sum); 
    } 

與您的代碼的問題是,作爲參數傳遞的arrray隱式轉換爲一個指向它的第一個元素。因此,在函數sum_array中,您使用的sizeof(int *)/ sizeof(int)對於您的系統等於1.

考慮到C標準(6.3.2.1左值,數組和函數指示符)

3除了當它是sizeof運算符的操作數或一元& 操作者,或是用於初始化數組文本的字符串,其具有輸入「」類型的數組「的 表達式」是轉換爲 表達式,其類型爲指向類型''的指針,該指針指向陣列的初始 元素y對象並不是左值。如果數組對象 具有寄存器存儲類,則行爲未定義。

+0

你的代碼的問題是......數組參數實際上不是數組參數,而是變相的指針參數。 – Deduplicator 2014-10-09 10:21:36

+0

@Deduplicator你是完全錯誤的。 arr被定義爲一個數組。只需將其轉換爲指針即可。 – 2014-10-09 10:24:40

+0

我認爲你偶然發現了那裏的語言困難。或者你閱讀標準錯誤。 – Deduplicator 2014-10-09 10:27:12

4
sizeofarr = sizeof(arr)/sizeof(arr[0]); 

這招來計算數組的大小不工作。因爲在函數中,arr會衰減到一個指針,而不是一個數組。

要解決此問題,請明確傳遞大小。

+0

它不衰減到指針,函數參數**是一個指針,即使它看起來不是。 – Deduplicator 2014-10-09 10:17:13

+0

@Deduplicator我指的是'main()'中的數組'arr'與'sum_arr()'中的指針'arr'。 – 2014-10-09 10:21:31

+0

仍然不衰減的功能,但通過時,這是更早。否則,你可以以某種方式防止功能中的衰減。 – Deduplicator 2014-10-09 10:22:56

2

記住,在C時傳遞一個數組作爲參數的功能,其實你傳遞一個指針到一個數組。

由於指針的大小和int是4或8,則會得到sizeof(int *)/sizeof int4/4 = 1爲64位的人 32位機器和8/4 = 2 )這是或。

+0

int的大小是16位或更多,它至少是一個字節。指針的大小至少爲一個字節。在現代系統中,它們通常是4個相應的4/8個字節。 – Deduplicator 2014-10-09 10:19:50

0

總之,C程序中的數組名(大多數情況下)轉換爲指針。一個例外是我們在數組上使用sizeof運算符。如果在本次比賽中將arr轉換爲指針,sizeof(arr)會給出指針的大小,而不是實際數組的大小,這樣會比較沒用,所以在這種情況下,a意味着數組本身。

在我的程序中,函數傳遞的數組被轉換爲一個指針。然後,sum_arr函數中的sizeof(arr)給出了指針的大小,而不是實際數組的大小。

這個程序應該以這種方式執行:

#include <stdio.h> 

#define SIZEOFARR(arr) (sizeof(arr)/sizeof(arr[0])) 

int main(){ 

int sum_arr(int arr[],int size); 
int arr[5]={232,44,3,4,5}; 
printf("The sum of the array is: %d\n",sum_arr(arr,SIZEOFARR(arr))); 


    return 0; 
} 

int sum_arr(int arr[],int size){ 
    int i,sum=0; 
    for(i=0;i<size;i++){ 
    sum+=arr[i]; 
    } 
    return (sum); 
} 
+0

其實你用你自己的話重寫了我的答案。:) – 2014-10-09 11:08:34

+0

其實,是的。我做了,因爲@Deduplicator不同意你的觀點。我對這個主題做了一些研究。 – 2014-10-09 11:13:29