Обнаружено разрушение стека при управлении файлами

У меня проблема с моей программой. Переменные написаны на итальянском языке, извините! Я должен справиться с этапом штрафных очков футбольного матча. Если в первых пяти пенальти команды заканчивают ничью, они будут идти на пенальти до конца.

    if (retiPrimaSquadra != retiSecondaSquadra){
        buffer = fopen("buffer.txt", "w");
        fprintf(buffer, "%d-%d", retiPrimaSquadra, retiSecondaSquadra);
        fclose(buffer);
        return 0;
    }   else {
        printf("Risultato secondo tempo supplementare: %d - %d\n\n", retiPrimaSquadra, retiSecondaSquadra);
        printf("RIGORI\n");

        int rigoreA=0, rigoreB=0;
        char vRigoreA[5];
        char vRigoreB[5];
        int rigore=0;
        int i=0;

        vRigoreA[i]='x';

        //printf("%c", vRigoreA[i]);
        for(i=0; i<5; i++){
        //tiro prima squadra
            rigore = (rand() % 101);
            if(rigore <= 75){
                rigoreA++;
                retiPrimaSquadra++;
                vRigoreA[i]='x';
            }
            else{
                vRigoreA[i]='o';
            }
        //tiro seconda squadra
            rigore = (rand() % 101);
            if(rigore <= 75){
                rigoreB++;
                retiSecondaSquadra++;
                vRigoreB[i]='x';
            }
            else{
                vRigoreB[i]='o';
            }
        //stampa xo
        printf("%c %c\n", vRigoreA[i], vRigoreB[i]);
        }
        //risultato 5 rigori
        printf("%d - %d\n", rigoreA, rigoreB);

        char enter = '\0';
        while(enter != '\n'){
            enter = getchar();
        }

        //OLTRANZA
        while(rigoreA==rigoreB){
            //tiro prima squadra
            rigore = (rand() % 101);
            if(rigore <= 75){
                rigoreA++;
                retiPrimaSquadra++;
                vRigoreA[i]='x';
            }   else {
                vRigoreA[i]='o';
            }

            //tiro seconda squadra
            rigore = (rand() % 101);
            if(rigore <= 75){
                rigoreB++;  
                retiSecondaSquadra++;
                vRigoreB[i]='x';
            }
            else{
                vRigoreB[i]='o';
            }
        //stampa xo
        printf("%c %c\n", vRigoreA[i], vRigoreB[i]);

        }

        printf("check\n");  
    }

    buffer = fopen("buffer.txt", "w");
    fprintf(buffer, "%d-%d", retiPrimaSquadra, retiSecondaSquadra);
    fclose(buffer);

}

Программа запускается без ошибок, если она не вошла в последнее "время". В противном случае, после завершения цикла while, когда он направляется к результатам в файле buffer.txt, он дает мне обнаруженную проблему с перебором стека. Я действительно не знаю, как справиться с этим, потому что это кажется настолько глупым, что, если он не входит, пока все идет хорошо!

1 ответ

Решение

Ты используешь i чтобы получить доступ к вашему vRigoreA Массив в то время (vRigoreA[i]='x';). Тем не мение, i установлен в 5 после вашего for-loop, так что вы обращаетесь к памяти стека, не принадлежащей массиву. В конце функции отладчик обнаруживает, что произошла запись за пределы.

Другие вопросы по тегам