2015-08-28 44 views
0

代碼片段:移動平均無故障靜態存儲

#include <stdio.h> 

int getAverage(int i, int array[]); 

int main(void) 
{ 
    int array [] = {45, 42, 41, 40, 43, 45, 46, 47, 49, 45}; //not working 
    static int array [] = {45, 42, 41, 40, 43, 45, 46, 47, 49, 45}; //works fine 
    int i, average = 0; 

    for (i = 0; i < sizeof(array)/sizeof(int); i++) 
     average = getAverage(i, array); 
    printf("Promedio: %d\n", average); 

    return 0; 
} 

int getAverage(int i, int array[]) 
{ 
    int c = (array[i]+array[i+1])/2; 
    return c; 
} 

我的問題是,因爲它給瞭如果我刪除陣列的靜態我的結果不正確。爲什麼會發生?

更新

int main(void) 
{ 
    int array [] = {45, 42, 41, 40, 43, 45, 46, 47, 49, 45}; 
    int i, average = 0; 

    for (i = 0; i < sizeof(array)/sizeof(int) - 1; i++) 
     average = (1 * array[i]) + (1.0 - 1) * average; 
    printf("Promedio: %d\n", average); 

    return 0; 
} 

我這樣做是與你的陣列上給函數的最後一次通話的界限的訪問出的維基百科

+0

關於您的更新:1)'1'是乘法的標識元素,因此是多餘的。 2)你認爲'(1.0 - 1)會產生什麼? (提示:'int'值'1'被轉換爲'double',即與'1.0'相同的類型)。請在發佈/進一步編輯之前正確測試數學並測試您的代碼。如果你真的迷失了,請看看數學網站;他們可能會幫助你,請事先閱讀tieir FAQ。 – Olaf

回答

1

公式。當i是最後一個索引時,array[i+1]將會結束。

這會導致未定義的行爲。當未定義的行爲被觸發時,任何事情都可能發生。

+0

,因爲如果我將靜態數組放在數組中 – Kevin

+1

@Tony「任何事情都可能發生」字面意思就是任何事情。出現工作就是其中之一。 –

1

要調用未定義行爲你訪問陣列,過去的最後一個元素:在最後的有效索引

array[i]+array[i+1] 

如果i是什麼?

static沒有糾正這一點,但顯然隱藏了效果。這純粹是巧合,並在沒有辦法有關static

請注意,您絕不計算moving average/media móvil。您只需計算兩個相鄰值的平均值(array[i],array[i+1])。當你的printf在循環之外時,你只需打印最後一個結果 - 這是最後一個元素,之後是禁止的內存)。

+0

因爲我可以避免這 – Kevin

+0

如何避免這種情況?那麼,在循環中減少一個。 – Olaf

+0

將是正確的公式 – Kevin

0

在您的for循環因子i < sizeof(array)/sizeof(int)中,您將設置我爲數組的最後一個有效索引,然後在getAverage函數中訪問array[i+1],該數組超出了數組的界限。這導致了未定義的行爲。

順便說一下,你唯一的輸出是最後兩個數字的平均值,我想知道你的目的是打印每兩個數字還是整個數組的平均值。

+1

for循環不會訪問任何內容。它只是計算索引。 – Olaf

+0

在您的for循環中,您調用'getAverage'函數,該函數將訪問您定義的數組。 –

+0

這不是**我的** for-loop,因爲我不是OP。你在句子的後半部分提到的功能;第一部分明確提到了循環結構。這只是你應該得到正確的短語。 「訪問」對於UB來說是一個非常重要的術語,它的出現位置正是這裏的要點。 – Olaf