繁体   English   中英

在文件管理中检测到c堆栈破坏

[英]c stack smashing detected on file managing

我的程序有问题。 变量用意大利语编写,对不起! 我必须处理足球比赛的处罚阶段。 如果球队在前五次处罚中均平局,则他们将最终处罚。

    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”中输入,则不会错误运行。 否则,在完成while循环后,当它正确返回到buffer.txt文件中的结果时,它给了我一个堆栈崩溃检测到的问题。 我真的不知道如何处理它,因为它看起来很愚蠢,以至于如果不输入它就可以了!

您正在使用i在一段时间( vRigoreA[i]='x'; )中访问您的vRigoreA数组。 但是,在for循环之后, i设置为5 ,因此您正在访问不属于该阵列的堆栈内存。 函数结束时,调试器检测到发生越界写入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM