2016-11-05 1 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]이 정의 됨)를 사용함을 의미합니다. i2 일 때 argv[i+1]으로 전화하면 argv[3]에 액세스하려고합니다.

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){ 문이 이런 일이 발생 을 배제하지 않는다?

이 명령문은 i가 argc보다 작 으면 코드를 계속 허용합니다. 세 가지 인자가 있다고 가정 해 보겠습니다. 2 이하의 값으로 진행할 수 있습니다.

바로 다음 행에 argv [i + 1]에 액세스하려고 시도합니다. 우리는 내가 2 일 수 있다는 것을 확증했습니다. 따라서 인덱스 3의 항목에 액세스하려고합니다. 인덱스가 0이고 3 개의 항목 (0, 1, 2)이 있으므로 항목을 액세스하려고 시도하고 있습니다. 존재하지 않습니다.

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