C SDL在声明任何标准变量时崩溃

C SDL在声明任何标准变量时崩溃,c,crash,sdl,sdl-2,C,Crash,Sdl,Sdl 2,这个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 S

这个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;
}
#包括
#包括
#包括
int main(int argc,char*argv[]){
//下面的行将导致SDL崩溃
//int blabla=640;
SDL_窗口*窗口;
SDL_Init(SDL_Init_视频);
window=SDL\u CreateWindow(
“相当特殊的SDL窗口”,
SDL_窗口位置未定义,
SDL_窗口位置未定义,
640,
480,
SDL\u窗口\u OPENGL
);
如果(窗口==NULL){
printf(“无法创建窗口:%s\n”,SDL_GetError());
返回1;
}
SDL_渲染器*渲染器;
SDL_纹理*纹理;
渲染器=SDL\u CreateRenderer(窗口,-1,SDL\u渲染器\u加速);
SDL_表面*刷;
笔刷=IMG_载荷(“brush2.png”);
纹理=SDL_CreateTextureFromSurface(渲染器、笔刷);
SDL_渲染器(渲染器);
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(渲染器、纹理、sRect、dRect);
SDL_渲染器呈现(渲染器);
SDL_延迟(1000);
SDL_窗口(窗口);
SDL_退出();
返回0;
}

您正在写入未分配的内存

SDL_Rect *sRect, *dRect;
sRect->w = 10; /* w doesn't exist. Writing is undefined behaviour. */
sRect
dRect
只是指针。在访问结构成员之前,它们需要指向有效内存

您可以在堆栈中声明它们:

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

您还应该检查
SDL\uu
-函数的返回值。如果这些操作失败,并且您继续执行,那么您可能会遇到奇怪的行为或崩溃。

您正在写入未分配的内存

SDL_Rect *sRect, *dRect;
sRect->w = 10; /* w doesn't exist. Writing is undefined behaviour. */
sRect
dRect
只是指针。在访问结构成员之前,它们需要指向有效内存

您可以在堆栈中声明它们:

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

您还应该检查
SDL\uu
-函数的返回值。如果这些操作失败,并且您继续执行,您可能会遇到奇怪的行为或崩溃。

您在哪里声明了该变量?@rullof请参阅注释掉的行“int blablabla=640”-是的,确实,如果声明了该不相关的变量(或任何不相关的变量),SDL将冻结而不会绘制。它可以很好地编译,如果没有SDL代码,也不会有任何问题,但是出于某种原因,如果我试图定义任何不相关的标准变量,例如注释掉的行,SDL就会冻结。换句话说,由于“int blablabla=640”被注释掉,您上面看到的代码可以很好地编译。如果您取消注释“int-blabla=640”或编写“int-bob=44”或“long-joe=34”,它当然可以编译,但SDL将冻结而不绘制。我希望这是有意义的。你在哪里声明了那个变量?@rullof请看注释掉的行“int blabla=640”-是的,事实上,如果声明了那个不相关的变量(或任何不相关的变量),SDL将冻结而不绘制。它可以很好地编译,如果没有SDL代码,也不会有任何问题,但是出于某种原因,如果我试图定义任何不相关的标准变量,例如注释掉的行,SDL就会冻结。换句话说,由于“int blablabla=640”被注释掉,您上面看到的代码可以很好地编译。如果您取消注释“int-blabla=640”或编写“int-bob=44”或“long-joe=34”,它当然可以编译,但SDL将冻结而不绘制。我希望这是有意义的。这些行不会导致错误-SDL要求指针,并且代码可以工作。它只是简单地声明一个变量(任何变量,与SDL无关——不相关是关键部分),导致SDL冻结。请参阅注释掉的行“intblabla=640”,如果我取消注释该行或声明任何变量,SDL将冻结。若我并没有声明任何变量,一切正常,SDL在屏幕上绘图。一个可能和另一个有什么关系?“blabla”变量甚至没有在程序中使用,也不会导致任何错误-为什么SDL在声明不相关的变量时会冻结?
sRect->w=10写入未分配区域。这将导致未定义的行为。这意味着任何事情都可能发生。它可能会工作,可能不会工作,可能会因为完全无关的原因崩溃。声明变量
blabla
很可能会更改
sRect
在堆栈上的位置,这意味着指针的初始(垃圾)值不同。它一开始工作纯粹是运气。谢谢-你的解决方案解决了它。我仍然不明白为什么C会让你写未分配的区域(那么分配的意义是什么?)以及这意味着“什么都可能发生”(例如,即使未分配的区域是“blabla”var,它仍然不应该影响SDL,因为变量永远不会被SDL访问或在该点之后的任何东西访问。但是它可以工作,再次感谢,我将继续。这些行不会导致错误-SDL请求指针,代码也可以工作。它只是声明一个变量(任何变量,与SDL无关-无关是关键部分)这会导致SDL冻结。请参阅注释掉的行“int blabla=640”,如果我取消注释该行或声明任何变量,SDL将冻结。如果我不声明任何变量,一切正常,SDL将在屏幕上绘制。其中一行可能与另一行有什么关系?blabla变量甚至没有在程序中使用,也不会导致任何错误-为什么SDL在声明一个不相关的变量时会冻结?
sRect->w=10;
写入未分配的区域。这将导致未定义的行为。这意味着任何事情都可能发生。它可能工作,也可能不工作,也可能由于完全不相关的原因而崩溃。声明变量able
blabla
最有可能更改堆栈上
sRect
的位置,这意味着指针的初始(垃圾)值不同。它首先工作纯粹是运气。谢谢