0

この SDL プログラムは正常に動作します (ウィンドウを表示し、ビットマップを描画します)。ただし、プログラムで変数 (int、long など) を宣言すると、ウィンドウがフリーズし、黒ではなく白になり、何も描画されません。 . 何が原因でしょうか?

#include <stdio.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>

int main(int argc, char* argv[]) {
    // line below will cause SDL crash
    // int blabla = 640; 
    SDL_Window *window;
    SDL_Init(SDL_INIT_VIDEO);
    window = SDL_CreateWindow(
        "A rather exceptional SDL window",
        SDL_WINDOWPOS_UNDEFINED,
        SDL_WINDOWPOS_UNDEFINED,
        640,
        480,
        SDL_WINDOW_OPENGL
    );
    if (window == NULL) {
        printf("Could not create window: %s\n", SDL_GetError());
        return 1;
    }
    SDL_Renderer *renderer;
    SDL_Texture *texture;
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    SDL_Surface *brush;
    brush = IMG_Load("brush2.png");
    texture = SDL_CreateTextureFromSurface(renderer, brush);
    SDL_RenderClear(renderer);
    SDL_Rect *sRect, *dRect;
    sRect->w = 10;
    sRect->h = 4;
    sRect->x = 0;
    sRect->y = 0;
    dRect->w = 10;
    dRect->h = 4;
    dRect->x = 10;
    dRect->y = 10;
    SDL_RenderCopy(renderer, texture, sRect, dRect);
    SDL_RenderPresent(renderer);
    SDL_Delay(1000);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 0;
}
4

1 に答える 1

6

未割り当てメモリを書き込んでいます。

SDL_Rect *sRect, *dRect;
sRect->w = 10; /* w doesn't exist. Writing is undefined behaviour. */

sRectdRectは単なるポインタです。構造体メンバーにアクセスする前に、有効なメモリを指す必要があります。

代わりにスタックで宣言できます。

SDL_Rect sRect, dRect;
sRect.w = 10;
sRect.h = 4;
...
SDL_RenderCopy(renderer, texture, &sRect, &dRect);

また、関数の戻り値も確認する必要がありSDL_ます。それらが失敗し、それでも実行を続行すると、奇妙な動作やクラッシュが発生する可能性があります。

于 2013-12-20T07:30:50.333 に答える