簡體   English   中英

C中的動態內存訪問沖突

[英]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));

第一次通過時,您在tailRowtailColumn只有 1 個條目,但您很可能會超過它。

Tailrow/tailColumn 被初始化為:

tailRow=malloc(1*sizeof(int));
tailColumn=malloc(1*sizeof(int));

因此,另一種選擇是在重新分配之前增加此初始分配以處理預計的增長。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM