2015-10-05 51 views
0

的代碼運行,直到它到達聲明:代碼崩潰在printf語句

printf("%d", sumOccur(input)); 

代碼:

#include <stdio.h> 
#include <stdlib.h> 
int sumOccur(int A[]); 

int main(){ 
    int input[6] = {1,1,1,2,2,3}; 
    printf("%d", sumOccur(input)); 
    return 0; 
} 

int sumOccur(int A[]) { 
int sum, i; 
    while(A[i]!='\0'){ 
    sum += A[i]; 
    i++; 
    } 
    return sum; 
} 

如果我做任何愚蠢的錯誤,請效勞。

+1

你眼前的問題是,'當你用它來索引陣列i'是未初始化。但是代碼有更多的問題... – pmg

+0

比較int和空字符在任何情況下似乎都不是一件非常明智的事情。 –

+0

@TomTanner OP很可能看到了'strlen()'或類似的實現,我不知道爲什麼如果你來自高級編程語言,你總是希望避免傳遞數組的長度。 –

回答

3

這不是printf()崩潰。它是sumOccur()。你的數組中沒有\0的值,所以你的while()永遠不會終止,並且你最終處於接近無限循環並跑出數組的末尾。

該數組是數字的數組,而不是一個字符串,所以沒有任何理由認爲那裏會有值爲null的終止符。 null結束符是用於字符串的,而不是數組的數組。

0

你的代碼調用未定義行爲:您訪問A[6]和後續不存在條目sumOccur試圖找到陣列中的最後0,但你不要在main功能把一個在input定義。

--------這裏砍,如果你不感興趣的血淋淋的實現細節--------

陣列被分配在棧上,非常接近頂部,因爲它是在main函數中實例化。直到您發現0可能會嘗試讀取超出堆棧頁末尾並導致分段錯誤。

3

在你的函數int sumOccur你有兩個problems-

sumi未初始化只是聲明。初始化爲0

2.while(A[i]!='\0')不會按預期工作,因爲您的數組沒有它的價值。

+0

真正的原因是隱藏在明顯的視線!單獨看起來似乎不足以保證發生事故。 – chqrlie

+0

@chqrlie是的,那是真的。 – ameyCU

+0

@pradyumna rahul:錯誤使用編譯器警告的另一個說明性案例。使用編譯器可以免費提供的所有幫助:'gcc -Wall -W -Werror'或'clang -Weverything'會指出錯誤** 1。**,儘管可能不是錯誤** 2。** – chqrlie

0

您正在迭代,而A[i] != '\0',但沒有'\0'在數組中,也永遠不會初始化sum這不太可能導致崩潰,但它可能是。

您需要將數組中元素的個數,就像你正在處理一個int數組這

#include <stdio.h> 
#include <stdlib.h> 

int sumOccur(size_t count, const int *A); 
int sumOccurCHQrlieWay(const int *A, size_t count); 

int main() 
{ 
    int input[] = {1, 1, 1, 2, 2, 3}; 
    printf("%d", sumOccur(sizeof(input)/sizeof(*input), input)); 
    return 0; 
} 

int sumOccur(size_t count, const int *A) 
{ 
    int sum; 
    sum = 0; 
    for (size_t i = 0 ; i < count ; ++i) 
     sum += A[i]; 
    return sum; 
} 

int sumOccurCHQrlieWay(const int *A, size_t count) 
{ 
    return sumOccur(count, A); 
} 
+0

Your 'sumOccur'的實現是有風險的:它無用地假定'count> 0'。用盡可能少的假設來實施效用函數是一種很好的做法。 – chqrlie

+0

絕對是的,但我在'main()'中調用它的方式不太可能發生,但你是對的。 –

+0

@chqrlie不再了,我注意到了! –

0

注意,這意味着它通常不包含「\ 0」 character.To迭代你需要指定elements.Here數量的陣列是正確的方法:

#include <stdio.h> 
#include <stdlib.h> 

int sumOccur(int A[],size_t number_of_elemets); 

int main(){ 

    int input[6] = {1,1,1,2,2,3}; 

    //Get the number of elements 
    size_t n = sizeof(input)/sizeof(int); 

    printf("%d", sumOccur(input,n)); 

    return 0; 
} 

int sumOccur(int A[],size_t number_of_elements) { 

    int sum = 0; 

    size_t i = 0; 

    while(i < number_of_elements) 
    { 
     sum += A[i]; 
     i++; 
    } 
    return sum; 
}