2017-12-13 17 views
-1

사전에서 가능한 모든 문자열을 생성하고 암호화하여 일부 저장된 해시와 비교할 수있는 재귀 함수가 있습니다.함수 호출시 분할 오류가 발생했습니다.

이전에 암호의 최대 길이에 대한 미리 정의 된 값이 있었지만 argv[1]으로 변경하려고했습니다. 그러나 프로그램을 실행할 때 설명이없는 Segmentation Fault이 표시됩니다.

덧붙여서, 포함되어있는 것은 모두 포함되어 있습니다 만, 다소 골치가 아팠기 때문에 나는 포함시키지 않았습니다.

int recur(char * mot , char * tab,int l,int max_l) 
{ 

// Because this was an exercice we had to do in class , i deleted this part 
// so some of my classmates dont copy/paste my code 
// if you are interested , contact me 

int main(int argc, char *argv[]) 
{ 
    char letters[36] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9'}; 
    char s[10]=""; 
    s[9]='\0'; 
    int l=0; 
    int max_l; 
    sscanf (argv[1],"%d",&max_l); 
    printf("max_l : %i\n",max_l); 
    printf("Debut ! \n"); 
    recur(s,letters,l,max_l); 
} 

감사합니다.

+1

코드에 많은 문제가 있습니다. 그들 중 하나는'recur' 함수에 아무것도 반환하지 않는 실행 경로가 있다는 것입니다. –

+1

충고 한 조각. 세분화 오류가 발생할 때 가장 먼저해야 할 일은 디버거로 코드를 디버깅하는 것입니다. 디버거를 사용하지 않고 코드를 사용하지 않거나 사용법을 모르는 경우 변수의 값을 다른 위치에 인쇄하여 변경 내용을 알 수 있습니다 그리고 프로그램이 멈춘 곳 –

+0

모든 경고와 디버그 정보로 코드를 컴파일하십시오 :'gcc -Wall -Wextra -g'와 [GCC] (http://gcc.gnu.org/). 코드를 개선하여 경고가 표시되지 않도록하십시오. 모든 조언을 위해 디버거'gdb' –

답변

4
printf("Argv[1] : %s\n", max_l); 

이것은 정의되지 않은 동작입니다. 잘못된 형식 지정자를 제공하고 있습니다. 그렇기 때문에 %s 형식 지정자를 사용하여 int을 인쇄하려고하면 오류가 발생합니다. \0을 찾은 다음 그렇지 않습니다. 따라서 UB에서 발생해서는 안되는 메모리를 액세스합니다. (그 결과 세분화 오류가 발생했습니다).

printf("Argv[1] : %d\n", max_l); 

는 또 다른 주요 문제는이 재귀 함수의 모든 제어 흐름 아닙니다 int를 반환해야합니다. 이것은 더 큰 문제에 대한 통로입니다. 예상 될 때 반환 값이없는 경우 동작은 정의되지 않습니다.

+0

감사합니다. 고맙습니다. 문제는 8 분 안에 답변으로 표시하겠습니다. –