ERRO: Program received signal SIGSEGV,segmantation fault. Linguagem C. Como resolver?

Alguém pode me ajudar com este programa? Quando escolho a opção 1 e digito um valor qualquer, ele aparece o erro: Program received signal SIGSEGV,segmantation fault e aponta a linha 80, ou seja, esta: “return (n + MinhaFuncao(n - 1));”…
Por outro lado, quando eu uso o código que está abaixo, comentado, isto é, entre /* */, em vez do código que está dando erro, tal erro não ocorre… contudo, esta mesma linha está nos dois programas (no que está comentado, e no que não está).
Se alguém puder, gostaria que me mostrasse como resolver este erro, e também como evitá-lo. Agradeço desde já!

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <locale.h>

#define TITULO_OPCAO1 "1. Efetue o cálculo com uma função recursiva;"
#define TITULO_OPCAO2 "2. Mostre-me a função recursiva utilizada;"
#define TITULO_OPCAO3 "3. Sair."

#define N_OPCOES 3
#define OPCAO1   1
#define OPCAO2   2
#define OPCAO3   3


void LimparBuffer(void)
{
    int valorLido;

    do{
        valorLido = getchar();
    } while((valorLido != '\n') && (valorLido != EOF));
}

int LeOpcao(int menorValor, int maiorValor)
{
    int op;

    while(1){
        printf("\nDigite a opção desejada: ");
        scanf("%d", &op);

        if((op >= menorValor) && (op <= maiorValor)){
            LimparBuffer();
            break;
        } else{
            printf("ERROR: Digite um número inteiro entre: %d e %d", menorValor, maiorValor);
            LimparBuffer();
        }
    } return op;
}

int LeInteiro(void)
{
    int umInt;
    int nValores;

    printf("\nDigite um valor inteiros e pressione ENTER: ");
    nValores = scanf("%d", &umInt);

    while(nValores == 0){
        printf("\nERROR: Você digitou um valor inválido.");
        printf("\nDigite um valor inteiros e pressione ENTER: ");
        LimparBuffer();
        nValores = scanf("%d", &umInt);
    }
    return umInt;
}

void ApresentaMenu(int nOpcoes, int menorOpcao, ...)
{
    int x;
    va_list argumentos;

    va_start(argumentos, menorOpcao);

    for(x = 0; x < nOpcoes; x++){
        printf("%c-%s\n", menorOpcao, va_arg(argumentos, char *));
    }

    va_end(argumentos);

}

int MinhaFuncao(int n)
{
    if(!n){
        return 0;
    }
    return (n + MinhaFuncao(n - 1));
}

int main(void)
{
    int x;
    unsigned char op;

    setlocale(LC_ALL, "Portuguese");

    ApresentaMenu(N_OPCOES, OPCAO1, TITULO_OPCAO1, TITULO_OPCAO2, TITULO_OPCAO3);

    op = LeOpcao(OPCAO1, OPCAO3);

    switch(op)
    {
        case 1:
            LeInteiro();
            printf("Retorno da função: %d", MinhaFuncao(x));
            printf("\n\n");
            break;

            return 0;
        case 2:
            printf("\n\nint MinhaFuncao(int n)\n{");
            printf("\n\tif(n == 0){");
            printf("\n\t\treturn 0;");
            printf("\n\t}");
            printf("\n\treturn (n + MinhaFuncao(n - 1));");
            printf("\n}\n\n\n\n\n\n\n\n\n\n\n\n\n");
            break;

        case 3:
            printf("\n\n\n\t\t\t\tENCERRANDO PRORAMA...\t\t\t\t\n\n\n\n\n\n\n\n\n\n\n\n\n");
            break;

            system("PAUSE");
            return 0;

        default:
            printf("\nERROR: Este programa tem um bug.\n");
            printf("\n\n\n\t\t\t\tENCERRANDO PRORAMA...\t\t\t\t\n\n\n\n\n\n\n\n\n\n\n\n\n");
    }

    system("PAUSE");
    return 0;

}


/*
extern int MinhaFuncao (int);

int main()
{
    int x;

    setlocale(LC_ALL, "Portuguese");

    printf("\nDigite um número inteiro maior que zero: ");
    scanf("%d", &x);

    MinhaFuncao(x);
    printf("Retorno da função: %d", MinhaFuncao(x));
    printf("\n\n");

    system("PAUSE");
    return 0;
}
//CONSTRUIR UMA FUNÇÃO INTERATIVA QUE TENHA O MESMO EFEITO DA FUNÇÃO ABAIXO:

int MinhaFuncao(int n)
{
    if(!n){
        return 0;
    }
    return (n + MinhaFuncao(n - 1));
}*/