2016-11-05 39 views
0

所以我試圖學習功能好一點,並能夠寫一個有用的,然後在遞歸和一個給予該程序的數字列表。不過,我在這裏遇到了分段錯誤。當我在argv[]中嘗試讀取argv[i+1]時,我覺得發生這種情況。但是,爲什麼我的if(i < argc){語句不檢查這種情況呢?基本Bool函數給出了段錯誤

這是我的代碼。

#include <stdio.h> 
#include <ctype.h> 
#include <math.h> 
#include <string.h> 
#include <stdbool.h> 

bool compare(val1,val2) 
{ 
    if(val1 > val2){return false;} 
    else{return true;} 
} 

// int values[], int n 
int main(int argc, char *argv[]) 
{ 
    for(int i=1; i<argc; i++){ 
     //print unsorted list 
     printf("%s\n",argv[i]); 
     if(i < argc){ 
      if(compare(*argv[i],*argv[i+1])) 
      { 
       printf("true\n"); 
      } 
      else 
      { 
       printf("false\n"); 
      } 


     } 
     // Add else for odd numbered lists 
    } 

    return 0; 
} 
+2

如果'我== ARGC - 1','的argv [I + 1]'是不確定的。 –

+0

就是這樣,感謝您的反饋。 – Gates

回答

1

argv[i+1]沒有如果i==argc-1定義。

例如,如果argc=3表示您使用兩個參數(argv[0],argv[1]argv[2]已定義)。當您撥打argv[i+1]時,您正嘗試訪問argv[3]i等於2

您只需要重新定義for並刪除if(i < argc)即可。

您的代碼可能是這樣的:

for(int i=1; i < argc-1; i++){ 
    //print unsorted list 
    printf("%s\n",argv[i]); 
    if(compare(*argv[i],*argv[i+1])) 
     printf("true\n"); 
    else 
     printf("false\n"); 
} 
2

爲什麼沒有我的if(i < argc){語句中檢查這種情況的發生排除這個 ?

此語句允許代碼繼續,如果我小於參數計數argc。假設你有三個參數,我可以以2或更小的值進行。

在下一行嘗試訪問argv [i + 1]。我們已經確定我可以是2,所以你試圖訪問索引3的一個項目。它的索引爲0,並且有3個項目(0,1,2),所以你試圖訪問一個項目,不存在。

if(compare(*argv[i],*argv[i+1]))