[英]Dynamic memory access violation in C
我正在嘗試在 Code::Blocks 中編寫一個蛇游戲並使用動態內存方法。 我可以在我的電腦上編譯和運行我的游戲,但我發送源代碼的其他人都無法運行該程序,他們收到了我在此處添加的返回消息。 錯誤圖像
這是我的代碼,如果有人想檢查和確定問題
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <stdlib.h>
int k,l,j,x,y,n,m;
int midPx,midPy;
void gotoxy(int x,int y){
COORD CRD;
CRD.X=x;
CRD.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),CRD);
}
int border(int n,int m)
{
gotoxy(10,5);
for(j=0; j<2*n; j++)
printf("\u2588");
gotoxy(10,5+m);
for(j=0; j<=2*n; j++)
printf("\u2588");
for(j=0; j<m ; j++)
{
gotoxy(10,5+j);
printf("\u2588");
gotoxy(10+2*n,5+j);
printf("\u2588");
}
midPx=10+n;
midPy=5+m/2;
x=n;
y=m;
return midPx,midPy,n,m;
}
void randBait()
{
srand(time());
k=11+rand()%31;
l=6+rand()%15;
}
int main()
{
system("chcp 65001");
system("cls");
int *tailRow;
int *tailColumn;
tailRow=malloc(1*sizeof(int));
tailColumn=malloc(1*sizeof(int));
int menu,borderx,bordery;
int mapSize,exitButton;
int sleepTime=0;
int difficulty;
int devam=1;
randBait();
unsigned char tus;
while(devam==1)
{
int continuity=1;
int score=0;
int dy=0,dx=0,tailLen=0;
system("cls");
printf("<<<<< WELCOME TO THE SNAKE GAME! >>>>>\n\n");
printf("-------------------------------\n");
printf("1. Start a New Game\n");
printf("2. Load Previously Saved Game\n");
printf("3. Configure Game Options\n");
printf("4. Exit\n");
printf("-------------------------------\n");
printf("Enter your choice:");
scanf("%d",&menu);
switch(menu)
{
case 1:
system("cls");
if(sleepTime==0)
{
printf("Please configure the game options first!");
continuity=0;
getch();
break;
}
border(borderx,bordery);
do
{
if(kbhit())
{
tus=getch();
if(tus==224)
{
tus=getch();
switch(tus)
{
case 72: dy=-1,dx=0;
break;
case 80: dy=1,dx=0;
break;
case 75: dy=0,dx=-1;
break;
case 77: dy=0,dx=1;
}
}
if(tus==109)
{
gotoxy(0,0);
printf("------------------------------------------------\n");
printf("Are you sure you want to exit to the Main Menu?\n");
printf("1. YES\n");
printf("2. NO\n");
//printf("%d",continuity);
scanf("%d",&exitButton);
switch(exitButton)
{
case 1:
continuity=0;
break;
case 2:
system("cls");
border(borderx,bordery);
break;
}
}
}
midPx=midPx+dx;
midPy=midPy+dy;
if(midPx>=10+(2*x))
{
continuity=0;
gotoxy(midPx,midPy);
printf(">>>>>GAME OVER<<<<<");
getch();
}
if(midPx<=10)
{
continuity=0;
gotoxy(midPx,midPy);
printf(">>>>>GAME OVER<<<<<");
getch();
}
if(midPy>=5+j){
continuity=0;
gotoxy(midPx,midPy);
printf(">>>>>GAME OVER<<<<<");
getch();
}
if(midPy<=5)
{
continuity=0;
gotoxy(midPx,midPy);
printf(">>>>>GAME OVER<<<<<");
getch();
}
tailRow[0]=midPx;
tailColumn[0]=midPy;
int i;
for(i=1; i<=tailLen; i++)
{
if(midPx==tailRow[i] && midPy==tailColumn[i])
{
gotoxy(midPx,midPy);
printf(">>>>>GAME OVER<<<<<");
continuity=0;
getch();
}
}
for(i=0; i<=tailLen; i++)
{
gotoxy(tailRow[i],tailColumn[i]);
printf("*");
}
if(dx==0)
{
switch(dy)
{
case 1:
gotoxy(midPx,midPy);printf("\u2B9F");
break;
case -1:
gotoxy(midPx,midPy);printf("\u2B9D");
break;
}
}
if(dy==0)
{
switch(dx)
{
case 1:
gotoxy(midPx,midPy);printf("\u2B9E");
break;
case -1:
gotoxy(midPx,midPy);printf("\u2B9C");
break;
}
}
if(midPx==k && midPy==l)
{
randBait();
tailLen++;
score+=10;
}
gotoxy(10+2*x-4,4);
printf("Score:%d %d %d ",score,midPx,midPy);
gotoxy(k,l);printf("O");
Sleep(sleepTime);
gotoxy(midPx,midPy);printf(" ");
for(i=0; i<=tailLen; i++){
gotoxy(tailRow[i],tailColumn[i]);
printf(" ");
}
for(i=tailLen; i>0; i--){
tailRow[i]=tailRow[i-1];
tailColumn[i]=tailColumn[i-1];
}
tailRow=realloc(tailRow,sizeof(int)*(tailLen+2));
tailColumn=realloc(tailColumn,sizeof(int)*(tailLen+2));
} while(continuity==1);
case 2:
{
break;
}
case 3:
system("cls");
printf("-------------------\n");
printf("Game difficulty:\n");
printf("1. Easy\n");
printf("2. Normal\n");
printf("3. Hard\n");
printf("4. Insane\n");
printf("-------------------\n");
printf("Enter your choice:");
scanf("%d",&difficulty);
switch(difficulty)
{
case 1:
sleepTime=400;
system("cls");
break;
case 2:
sleepTime=240;
system("cls");
break;
case 3:
sleepTime=120;
system("cls");
break;
case 4:
sleepTime=60;
system("cls");
break;
}
printf("-------------------\n");
printf("Choose map size:\n");
printf("1. Small (16x16)\n");
printf("2. Medium (32x32)\n");
printf("3. Large (64x64)\n");
printf("-------------------\n");
printf("Enter your choice:");
scanf("%d",&mapSize);
switch(mapSize)
{
case 1:
system("cls");
borderx=16;
bordery=16;
break;
case 2:
system("cls");
borderx=32;
bordery=32;
break;
case 3:
system("cls");
borderx=64;
bordery=64;
break;
}
break;
case 4:
{
system("cls");
printf("<<< THANKS FOR PLAYING THE GAME >>>");
devam=0;
}
}
}
free(tailColumn);
free(tailRow);
getchar();
return 0;
}
很可能這段代碼的順序有誤:
/*USE*/
for(i=tailLen; i>0; i--){
tailRow[i]=tailRow[i-1];
tailColumn[i]=tailColumn[i-1];
}
/*ALLOC*/
tailRow=realloc(tailRow,sizeof(int)*(tailLen+2));
tailColumn=realloc(tailColumn,sizeof(int)*(tailLen+2));
第一次通過時,您在tailRow
和tailColumn
只有 1 個條目,但您很可能會超過它。
Tailrow/tailColumn 被初始化為:
tailRow=malloc(1*sizeof(int));
tailColumn=malloc(1*sizeof(int));
因此,另一種選擇是在重新分配之前增加此初始分配以處理預計的增長。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.