【发布时间】: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->w指针,但要初始化它们,您需要迭代SCREEN_HEIGHT/GrassBlock->h次......这些数字可能不一样(而且您没有分配指针,而且这看起来像 2D 数组,而不是 3D)跨度> -
顺便说一句,您需要强制转换那些
malloc调用的原因,以及您可以使用crate_t结构成员的内联初始化的原因是因为您使用C++ 进行编程! 要么停止这样做并正确地用 C 编程,要么get a good beginners C++ book (or two) 并正确地学习 C++。 -
对于N个元素的数组,有效索引是多少?检查那些循环条件!