【问题标题】:Unable to read memory. Can't find what's wrong无法读取内存。找不到问题所在
【发布时间】:2018-01-09 14:54:28
【问题描述】:

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

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

然后在主函数中创建一个二维数组

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。

【问题讨论】:

  • 只标记一种语言,C 不是 C++
  • 您没有发现将sizeof(crate) 用于两个分配有什么问题吗?
  • 在你的 for 循环初始化时有异味。您分配 SCREEN_WIDTH / GrassBlock-&gt;w 指针,但要初始化它们,您需要迭代 SCREEN_HEIGHT/GrassBlock-&gt;h 次......这些数字可能不一样(而且您没有分配指针,而且这看起来像 2D 数组,而不是 3D)跨度>
  • 顺便说一句,您需要强制转换那些malloc 调用的原因,以及您可以使用crate_t 结构成员的内联初始化的原因是因为您使用C++ 进行编程! 要么停止这样做并正确地用 C 编程,要么get a good beginners C++ book (or two) 并正确地学习 C++。
  • 对于N个元素的数组,有效索引是多少?检查那些循环条件!

标签: c memory


【解决方案1】:

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

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

【讨论】:

  • 虽然这更正确,但考虑到sizeof(create) 应该比sizeof(crate*) 大一些,它应该不会影响任何事情。
【解决方案2】:

感谢所有帮助的人。问题是迭代器,我不仅让我的二维数组 SCREEN_HEIGHT 宽和 SCREEN_WIDTH 高,这与我想要的相反,而且 DrawLevelBG 中的迭代也是错误的,正如所指出的那样。我不得不交换我的“i”和“j”并进行一些更正,所以非常感谢一些程序员老兄指出了这一点。非常感谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多