Programa não executa ao preencher vetor com números randômicos não repetidos em C

Estou tentando fazer com que o números randômicos sejam gerados e preencher um vetor em uma função separada, porém o programa não executa e trava se eu colocar um número alto, e nem tão alto, como 50 ou 100. Abaixo segue meu código, se alguém souber o que está errado me ajuda aí, pfv.

#include<time.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<locale.h>

//variáveis globais
int tamanho = 0;

//links das funções
int menuPrincipal();
int retornaTamanho();
void preencheVetor(int tamanhoVetor, int *vetor);

int main(){
    setlocale(LC_ALL, "Portuguese");

    int opcao = 0, vetor[tamanho];

    do{
        opcao = menuPrincipal();

        switch(opcao){
        case 0:
            printf("\n ----------- APLICAÇÃO ENCERRADA! ----------- \n");
            exit(0);
            break;
        case 1:
            tamanho = retornaTamanho();

            printf("\n Tamanho do Vetor = %d \n", tamanho);

            preencheVetor(tamanho, vetor);

            break;
        default:
            printf("\n ----------- OPÇÃO INVÁLIDA ----------- \n\n");
            system("pause");
            system("cls");
            break;
        }
    }while(true);

    return 0;
}

int menuPrincipal(){
    int opcaoMenu = 0;

    printf("\n ------------ MENU ------------ \n");
    printf("\n ESCOLHA O MÉTODO DE ORDENAÇÃO: \n");
    printf("\n 1 - BUBBLE SORT \n");
    printf("\n 2 - SELECT SORT \n");
    printf("\n 3 - INSERT SORT \n");
    printf("\n 0 - SAIR \n");
    printf("\n DIGITE SUA OPÇÃO = ");
    scanf("%d", &opcaoMenu);

    system("cls");

    return opcaoMenu;
}

int retornaTamanho(){
    int opcaoTamanho = 0, valorTamanho = 0;

    printf("\n ------- TAMANHO DO VETOR -------- \n");
    printf("\n ESCOLHA O TAMANHO DO VETOR: \n");
    printf("\n 1 - 100 \n");
    printf("\n 2 - 10.000 \n");
    printf("\n 3 - 100.000 \n");
    printf("\n 4 - 1.000.000 \n");
    printf("\n 0 - VOLTAR \n");
    printf("\n DIGITE SUA OPÇÃO = ");
    scanf("%d", &opcaoTamanho);

    system("cls");

    switch(opcaoTamanho){
    case 0:
        main();
        break;
    case 1:
        valorTamanho = 100;
        break;
    case 2:
        valorTamanho = 10000;
        break;
    case 3:
        valorTamanho = 100000;
        break;
    case 4:
        valorTamanho = 1000000;
        break;
    default:
        retornaTamanho();
        break;
    }

    return valorTamanho;
}

void preencheVetor(int tamanhoVetor, int *vetor){
    int randomico = 0;

    bool numExistente = false;

    srand(time(NULL));

    for(int i = 0; i < tamanhoVetor; i++){

        randomico = (int) rand() % tamanhoVetor;

        for(int j = 0; j < i; j++){
            if(randomico == vetor[j]){
                numExistente = true;
                break;
            }
        }

        if(!numExistente){
            vetor[i] = randomico;
        }else{
            i--;
        }
    }
}