Обнаружено разрушение стека при управлении файлами
У меня проблема с моей программой. Переменные написаны на итальянском языке, извините! Я должен справиться с этапом штрафных очков футбольного матча. Если в первых пяти пенальти команды заканчивают ничью, они будут идти на пенальти до конца.
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, так что вы обращаетесь к памяти стека, не принадлежащей массиву. В конце функции отладчик обнаруживает, что произошла запись за пределы.