Распечатать пару скобок, получить ошибку сегментации

Я хочу распечатать все допустимые комбинации n-параметров скобок в C. В основном я даю значение 3. Это я хочу распечатать все комбинации допустимых скобок с 3 левыми скобками и 3 правыми скобками. Однако у меня возникла ошибка сегментации, gdb печатает в строку _printValidParentheses(str, leftCount--, rightCount, count++);. Мне интересно, кто-нибудь знает, почему я получил ошибку? Спасибо.

void printString(char * str) {
    while (*str) {
        printf("%c", *str++);
    }
    printf("\n");
}

void _printValidParentheses(char str[], int leftCount, int rightCount, int count) {
    if (leftCount < 0 || rightCount < 0) {
        return;
    }

    if (leftCount == 0 && rightCount == 0) {
        printString(str);
        return;
    } else {
        if (leftCount > 0) {
            str[count] = '(';
            _printValidParentheses(str, leftCount--, rightCount, count++);
        } 

        if (rightCount > leftCount) {
            str[count] = ')';
            _printValidParentheses(str, leftCount, rightCount--, count++);
        }

    }
}

void printValidParentheses(int n) {
    char *str = malloc(sizeof(char) * n * 2);
    _printValidParentheses(str, n, n, 0);
}

int main() {
    printValidParentheses(3);
    return 1;
}

person Simon Guo    schedule 19.12.2011    source источник


Ответы (1)


Вы уменьшаете/увеличиваете переменные в этой строке:

_printValidParentheses(str, leftCount--, rightCount, count++);

только после вызова функции, поэтому вы получаете StackOverflow, поскольку функция каждый раз вызывается с одними и теми же аргументами , и вызывает себя рекурсивно.

person MByD    schedule 19.12.2011
comment
вау, спасибо, что указали на это. поэтому я изменил на _printValidParentheses(str, leftCount-1, rightCount, count+1); и отлично работает. Спасибо. - person Simon Guo; 20.12.2011