2015-02-10 52 views
0

我有這個代碼,它工作得很好除了當我的輸入是數字「2」「錯誤分段錯誤(核心轉儲)」,而在數組中使用C

我不知道爲什麼,代碼似乎沒問題... 有什麼問題嗎?

void initValue(int *a, int dim, int value, int i); 
int findValue(int *a, int dim, int value, int i); 

main(){ 
    int i, value, dim = 5; 
    int a[dim]; 

    initValue(a, dim, value, i); 

    printf("\nYour values are: "); 
    for(i = 0; i < dim; i++) printf("%d ", a[i]); 
    printf("\n\n"); 
} 

void initValue(int *a, int dim, int value, int i){ 
    printf("Insert your values:\n"); 

    for(i = 0; i < dim; i++){ 
     scanf("%d", &value); 
     if(findValue(a, dim, value, i) == 1){ 
      printf("This value already exist, please insert a new one.\n"); 
      i--; 
     } 
     else a[i] = value; 
    } 
} 

int findValue(int *a, int dim, int value, int i){ 
    int j, result = 0; 
    for(j = 0; j < i || a[j] != value; j++) if(a[j] == value) result = 1; 

    return result; 
} 
+3

編譯所有的警告和調試信息('GCC -Wall -Wextra -g' )。然後**使用調試器**('gdb')。閱讀關於[未定義的行爲](http://en.wikipedia.org/wiki/Undefined_behavior) – 2015-02-10 20:39:10

+2

除了'int * a'和'int dim'外,我發現從main()傳遞變量沒有意義,爲什麼你在做那個嗎?另外,你的意見是什麼? – 2015-02-10 20:42:05

+0

@iharob我的教授給了我這個練習:( – 2015-02-10 20:48:26

回答

2

在你的代碼中的錯誤是在這一行中的邏輯錯誤:

for(j = 0; j < i || a[j] != value; j++) if(a[j] == value) result = 1; 

說你有dim=5i=2value=10,這是不存在a。由於a[j] != value爲真,因此循環不會在j=2處停止。之後,您將進入未定義的行爲區域。

這行需要更改爲:

for(j = 0; j < i ; j++) if(a[j] == value) return 1; 

功能現在可以簡化爲:

int findValue(int *a, int dim, int value, int i){ 
    int j = 0; 
    for(j = 0; j < i ; j++) 
    { 
     if(a[j] == value) 
     { 
     result = 1; 
     } 
    } 
    return 0; 
} 
2
  1. 您必須檢查scanf()沒有成功,像

    if (scanf("%d", &value) != 1) 
        maybeRemoveAllWhitespacesAndScanfAgain_MaybeReturnWithAnError(); 
    
  2. 你遞減i永不檢查i < 0

    for(i = 0; (i < dim) && (i >= 0) ; i++){ 
    
  3. initValue()可以被定義爲

    void initValue(int *a, int dim) 
    { 
        int value; 
        int i; 
        . 
        . 
        . 
    } 
    

有從main()傳遞變量是沒有意義的。

還有一件事,如果您在scanf()之前初始化value,則可以防止在未初始化時嘗試訪問它。

+0

是的,那是一個愚蠢的錯誤:) – 2015-02-10 20:51:15