运行时检查失败 #2 - 变量“e_color”周围的堆栈已损坏

Posted

技术标签:

【中文标题】运行时检查失败 #2 - 变量“e_color”周围的堆栈已损坏【英文标题】:Run-Time Check Failure #2 - Stack around the variable 'e_color' was corrupted 【发布时间】:2013-04-10 22:41:09 【问题描述】:

所以我对这个网站以及使用 c++ 和 allegro 编程有点陌生,但是我在制作的这个游戏中一直遇到这个问题,我似乎无法弄清楚.这似乎不是数组溢出(我最初是这么想的),所以如果有人知道问题出在哪里,我会很高兴。

代码很长,抱歉。我真的不知道我在做什么。我遗漏了一些内容,所以希望这不会影响任何事情。

提前致谢。

    void main() 
    InitGraphics(); // see function above for Allegro initialization
    srand(time(NULL));

    int x = 20, y = 20, e_color[9], color = 0x0000FF00;
    int x_enemy[9], y_enemy[9];
    bool over = false, hit[9];
    BITMAP* buffer = create_bitmap(screen->w,screen->h);

    initialization(x_enemy, y_enemy, x, y, e_color, hit, color, buffer); // begins the game, inculding initializing player and enemies

    game_play(x_enemy, y_enemy, x, y, e_color, hit, color, over, buffer); // plays the game

    end_message(x_enemy, y_enemy, x, y, e_color, hit, color, over, buffer); // ends the game

    rest(750);


END_OF_MAIN()

// the introduction and initialization of the game
void initialization(int x_enemy[9], int y_enemy[9], int x, int y, int e_color[9], bool hit[9], int color, BITMAP* buffer) 

    intro(buffer);

    initialize_enemy(x_enemy, y_enemy, e_color, hit);
    circlefill(buffer,x,y,10,color); // the player
    draw_enemy(x_enemy, y_enemy, e_color, buffer);

    countdown(buffer);


// calls the functions and runs the loop needed to actually play the game
void game_play(int x_enemy[9], int y_enemy[9], int x, int y, int e_color[9], bool hit[9], int color, bool over, BITMAP* buffer) 

    while(key[KEY_ESC] == 0 && over == false) 

        enemy_movement(x_enemy, y_enemy, e_color, buffer);
        rest(5);
        draw_enemy(x_enemy, y_enemy, e_color, buffer);
        test_contact(x_enemy, y_enemy, x, y, e_color, hit, buffer);
        over = test_end(hit);
        if (over == true)
            the_end(e_color, buffer);

        ///////// PLAYER MOVEMENT ////////////

        circlefill(buffer,x,y,10,color); // the player

        if (key[KEY_UP]) 
            circlefill(buffer,x,y,10,0);
            if (y < (0+10))
                y = y;
            else
                y = y-2;
            circlefill(buffer,x,y,10,color);
        
        if (key[KEY_DOWN]) 
            circlefill(buffer,x,y,10,0);
            if (y > (480-10))
                y = y;
            else
                y = y+2;
            circlefill(buffer,x,y,10,color);
        
        if (key[KEY_LEFT]) 
            circlefill(buffer,x,y,10,0);
            if (x < (0+10))
                x = x;
            else
                x = x-2;
            circlefill(buffer,x,y,10,color);
        
        if (key[KEY_RIGHT]) 
            circlefill(buffer,x,y,10,0);
            if (x > (640-10))
                x = x;
            else
                x = x+2;
            circlefill(buffer,x,y,10,color);
        
        /////// END PLAYER MOVEMENT //////////

        blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
    


// a message to the user saying game over and thank you for playing, includes a re-play option

void end_message(int x_enemy[9], int y_enemy[9], int x, int y, int e_color[9], bool hit[9], int color, bool over, BITMAP* buffer) 
    textprintf_centre(buffer, font, screen->w/2, screen->h/2, 0x00FFFFFF, "You Won!");
    blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
    rest(1500);
    clear(buffer);
    textprintf_centre(buffer, font, screen->w/2, ((screen->h/2)+15), 0x00FFFFFF, "Thank you for playing the Game.");
    blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
    rest(1000);
    textprintf_centre(buffer, font, screen->w/2, ((screen->h/2)+30), 0x00FFFFFF, "To play one more time, press 'n'.");
    blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
    rest(1000);
    textprintf_centre(buffer, font, screen->w/2, ((screen->h/2)+45), 0x00FFFFFF, "To quit, press any other key.");
    blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
    clear_keybuf();
    char answer = readkey();
    clear(buffer);
    blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);

    if (answer == 110)
    
        textprintf_centre(buffer, font, screen->w/2, screen->h/2, 0x00FFFFFF, "Starting new game.");
        blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
        rest(1000);
        clear(buffer);
        initialization(x_enemy, y_enemy, x, y, e_color, hit, color, buffer);
        game_play(x_enemy, y_enemy, x, y, e_color, hit, color, over, buffer);
        rest(750);
        textprintf_centre(buffer, font, screen->w/2, screen->h/2, 0x00FFFFFF, "You Won!");
        blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
        rest(1500);
        clear(buffer);
        textprintf_centre(buffer, font, screen->w/2, ((screen->h/2)+15), 0x00FFFFFF, "Thank you for playing the Game again.");
        blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
        rest(750);
        textprintf_centre(buffer, font, screen->w/2, ((screen->h/2)+30), 0x00FFFFFF, "Press any key to quit.");
        blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
        rest(750);
        clear_keybuf();
        readkey();
        clear(buffer);
    


// text introduction message
void intro(BITMAP* buffer = create_bitmap(screen->w,screen->h)) 
    textprintf_centre(buffer, font, screen->w/2, screen->h/2, 0x00FFFFFF, "Welcome to the Game.");
    blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
    rest(500);
    textprintf(buffer, font, ((screen->w)-225), ((screen->h)-15), 0x00FFFFFF, "Press any key to continue.");
    blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
    readkey();
    clear(buffer);
    ///
    textprintf_centre(buffer, font, screen->w/2, screen->h/2, 0x00FFFFFF, "Press 'r' for rules or any other key to continue to game.");
    blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
    char ans = readkey();
    if (ans == 114)
    
        // lots and lots of text, yay
        clear(buffer);
        textprintf_centre(buffer, font, screen->w/2, screen->h/2, 0x00FFFFFF, "Rules");
        blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
        rest(750);
        textprintf_centre(buffer, font, screen->w/2, ((screen->h/2)+15), 0x00FFFFFF, "Move your player using the arrow keys.");
        blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
        rest(750);
        textprintf_centre(buffer, font, screen->w/2, ((screen->h/2)+30), 0x00FFFFFF, "Catch all the red enemies to turn them blue.");
        blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
        rest(750);
        textprintf_centre(buffer, font, screen->w/2, ((screen->h/2)+45), 0x00FFFFFF, "Once all the enemies have been frozen, you win!");
        blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
        rest(750);
        textprintf_centre(buffer, font, screen->w/2, ((screen->h/2)+60), 0x00FFFFFF, "Press ESCAPE at any time to quit game.");
        blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
        rest(750);
        textprintf(buffer, font, ((screen->w)-225), ((screen->h)-15), 0x00FFFFFF, "Press any key to continue.");
        blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
        readkey();
        clear(buffer);
    
    clear(buffer);


// counts down from three
void countdown(BITMAP* buffer = create_bitmap(screen->w,screen->h)) 
    textprintf_centre(buffer, font, screen->w/2, screen->h/2, 0x00FFFFFF, "3");
    blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
    rest(1000);
    textprintf_centre(buffer, font, screen->w/2, screen->h/2, 0, "3");
    textprintf_centre(buffer, font, screen->w/2, screen->h/2, 0x00FFFFFF, "2");
    blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
    rest(1000);
    textprintf_centre(buffer, font, screen->w/2, screen->h/2, 0, "2");
    textprintf_centre(buffer, font, screen->w/2, screen->h/2, 0x00FFFFFF, "1");
    blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
    rest(1000);
    textprintf_centre(buffer, font, screen->w/2, screen->h/2, 0, "1");
    textprintf_centre(buffer, font, screen->w/2, screen->h/2, 0x00FFFFFF, "Go");
    blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
    rest(1000);
    clear(buffer);


// the enemies intial spot
void initialize_enemy(int x[9], int y[9], int color[9], bool hit[9]) 

    //seed the random number generator
    srand((unsigned)time(0));

    for(int a = 0 ; a < 10 ; a++)
    
        hit[a] = false;
        x[a] = rand()%620;
        y[a] = rand()%460;
        color[a] = 0x00FF0000;
    

【问题讨论】:

【参考方案1】:

首先,如果你初始化一个有 9 个插槽的数组,你只能在 0-8 范围内使用它们(总共 9 个)

void initialize_enemy(int x[9], int y[9], int color[9], bool hit[9]) 

//seed the random number generator
srand((unsigned)time(0));

    for(int a = 0 ; a < 9 ; a++) // The array size of every variable is not big enough
                                // So I changed it accordingly to 9 from 10
        hit[a] = false;
        x[a] = rand()%620;
        y[a] = rand()%460;
        color[a] = 0x00FF0000;
    

您遗漏了代码中 50% 的重要部分,我认为您在任何地方都犯了这个错误,但您可以搜索所有代码并轻松解决问题。

【讨论】:

以上是关于运行时检查失败 #2 - 变量“e_color”周围的堆栈已损坏的主要内容,如果未能解决你的问题,请参考以下文章

运行时检查失败 #2 - 变量“结果”周围的堆栈已损坏

运行时检查失败 #2 - 变量“primes”周围的堆栈已损坏

c++ 运行时检查失败 #2 - 变量“ToSend22”周围的堆栈已损坏

运行时检查失败 #2 - 变量周围的堆栈已损坏

运行时检查失败 #2 - 变量“l1”周围的堆栈已损坏

运行时检查失败 #2 - 变量“索引”周围的堆栈已损坏