[QUADTREE] Recursive 방식으로 런타임 오류가 발생 문의(C코드)

  • unlimmit
    unlimmit

    QUADTREE를 C코드로 Recursive 방식으로 풀었는데 Stack overflow가 발생하는 듯 합니다.

    런타임 오류 메시지 :

    RTE (SIGSEGV: segmentation fault, probably incorrect memory access or stack overflow)

    제출 소스 보기

    #include

    #define MAX_LEN 1000

    char reserve[MAX_LEN+1];
    char lt[MAX_LEN+1];
    char rt[MAX_LEN+1];
    char lb[MAX_LEN+1];
    char rb[MAX_LEN+1];

    char *reverse_tree(char *str, int *s){

    char ch;
    
    ch = str[*s];
    if(ch=='b' || ch=='w'){
        sprintf(reserve, "%c", ch);
        *s = (*s)++;
        return reserve;
    }   
    *s = (*s)++;
    
    sprintf(lt, "%s",reverse_tree(str, s));
    sprintf(rt, "%s",reverse_tree(str, s));
    sprintf(lb, "%s",reverse_tree(str, s));
    sprintf(rb, "%s",reverse_tree(str, s));
    
    //sprintf(result, "x%s%s%s%s", lt, rt, lb, rb); // original
    sprintf(reserve, "x%s%s%s%s", lb, rb, lt, rt);  // flip;
    //sprintf_s(result, "x%s%s%s%s", rt, lt, rb, lb);   // mirror;      
    return reserve;

    }

    int main(){

    int T, tc, N, i, len, s;
    scanf("%d", &T);
    char str[MAX_LEN+1];
    char result[MAX_LEN+1];
    
    for(tc=0; tc<T; tc++){
        scanf("%s", str);
        len = 0;
        while(str[len]!='\0') len++;
        s = 0;
        sprintf(result, "%s",reverse_tree(str, &s));        
        printf("%s\n", result); 
    }
    
    
    return 0;

    }

    배열을 전역으로 바꿨는데도 발생하는데 무슨 문제가 있을까요?
    도움 부탁드립니다.


    5년 전
1개의 댓글이 있습니다.
  • restart
    restart

    *s = (*s)++;는 *s=(*s)+1이나 (*s)++로 바꿔주셔야 합니다;
    그리고 전역변수는 reserve만 두어야겠네요.. lt,rt,lb,rb는 전역으로 둘 경우 recursion속에서 서로 섞여버립니다.

    포인터 사용은 디버그를 어렵게 만듭니다..ㅠㅠ STL을 사용하세요..


    5년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.