无法读取内存。找不到什么问题

时间:2018-01-09 14:54:28

标签: c memory

我有一段代码,其目的是在其中一个游戏关卡上绘制背景图像。为此,我创建了这个结构。

typedef struct crate_t {
            int x = 0;
            int y = 0;
            int h = 0;
            int w = 0;
            int type = BACKGROUND;
        }crate;

然后在main函数中创建一个2D数组

crate **Crates = (crate**)malloc(sizeof(crate)*(SCREEN_WIDTH / GrassBlock->w));
for (int i = 0; i <= SCREEN_HEIGHT/GrassBlock->h; i++) {
    Crates[i] = (crate*)malloc(sizeof(crate)*(SCREEN_HEIGHT / GrassBlock->h));
}

我将它传递给函数counter = DrawLevelBG(screen, GrassBlock, Border, Crates);。问题是该功能导致错误。 “访问违规写入位置。”在Obstacles[i][j].x = x;

int DrawLevelBG(SDL_Surface *screen, SDL_Surface *sprite, SDL_Surface *border, crate **Obstacles) {
        int x = 0;
        int y = 0;
        int i = 0;
        int j = 0;
        bool condition = 0;
        while (y < SCREEN_HEIGHT + sprite->h) {
            DrawSurface(screen, sprite, x + (sprite->w / 2), y + (sprite->h / 2));
            if (x >= SCREEN_WIDTH - sprite->w || x == 0 || y == 0 || y >= SCREEN_HEIGHT - sprite->h) {
                DrawSurface(screen, border, x + (sprite->w / 2), y + (sprite->h / 2));
                Obstacles[i][j].x = x;
                Obstacles[i][j].y = y;
                Obstacles[i][j].h = border->h;
                Obstacles[i][j].w = border->w;
                Obstacles[i][j].type = WALL;
                i++;
                if (x >= SCREEN_WIDTH - sprite->w) {
                    y += sprite->h;
                    x = 0;
                    j++;
                    condition = 1;
                }
            }
            if (!condition) {
                x += sprite->w;
            }
            condition = 0;
        }
        return i;
    }

我知道这些是由指针实际上没有指向任何东西引起的,但是我无法理解这里有什么问题。任何帮助将不胜感激。感谢。

修改

我已经更改了我的内存分配代码,所以它现在看起来像这样:

crate **Crates = (crate**)malloc(sizeof(crate*)*(SCREEN_WIDTH / GrassBlock->w)*(SCREEN_HEIGHT / GrassBlock->h));
for (int i = 0; i <= SCREEN_WIDTH/GrassBlock->w; i++) {
    Crates[i] = (crate*)malloc(sizeof(crate)*(SCREEN_HEIGHT / GrassBlock->h));
}

据你所有回复的人说。不幸的是,这并没有解决问题。 +重要信息,DrawLevelBG函数在循环的第一次迭代中导致ERROR。

2 个答案:

答案 0 :(得分:2)

在第一次分配中,您可以从指针创建一个数组。所以你需要为指针分配内存:

crate **Crates = (crate**)malloc(sizeof(crate*)*(SCREEN_WIDTH / GrassBlock->w));

答案 1 :(得分:0)

感谢所有帮助人员。问题是迭代器,我不仅使我的2D数组SCREEN_HEIGHT变宽,SCREEN_WIDTH变高,这与我想要的相反,但DrawLevelBG中的迭代是错误的指出。我不得不交换我的“我”和“j”并进行一些更正,所以非常感谢一些程序员指出这一点。非常感谢。