在文件管理中检测到 c 堆栈粉碎

标签 c file stack-smash

我的程序有问题。变量是用意大利语写的,对不起! 我必须处理足球比赛的点球阶段。如果在前五场点球比赛中双方打成平局,则进入点球大战。

    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 文件中的结果正确时,它会给我一个堆栈粉碎检测到的问题。我真的不知道如何处理它,因为它看起来很愚蠢,如果它不进入 while 就可以了!

最佳答案

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

关于在文件管理中检测到 c 堆栈粉碎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24034820/

相关文章:

c - 在程序开始时随机化#define

c - C 程序获取输出时出现问题

c - 参数比预期更多的函数调用

c - 当我访问超出我分配的内存时,为什么我没有收到堆栈粉碎错误?

c - 新手帮助(C语言)里面有详细说明

python - 如何输出文件python中的每一行

Perl 目录、文件排序、带大小和日期的打印列表

scala - 在 Scala 脚本文件中使用源路径

arrays - 为什么使用 C 引用这个 char 数组会导致堆栈崩溃?

ios - 在 ios swift 中启用堆栈金丝雀