[英]Random memory acces violation
我有以下示例代码:
map *d;
i = MAP_SIZE;
j = sizeof(map);
d = malloc(MAP_SIZE);
if (d == NULL) {
exit(EXIT_FAILURE);
}
dest.x = dest.y = 0;
for (i = 0; i < WINDOW_HEIGHT / AREA_RESOLUTION; i++)
{
for (j = 0; j < WINDOW_WIDTH / AREA_RESOLUTION; j++)
{
k = GetAreaPos(j, i);
Area = d[k];
dest.x = j*AREA_RESOLUTION;
dest.y = i*AREA_RESOLUTION;
if (Area->landType == DESTRUCTIBLE_BRICK) { //GOT ERROR HERE
SDL_QueryTexture(Game_Texture->Explodable, NULL, NULL, &dest.w, &dest.h);
SDL_RenderCopy(Renderer, Game_Texture->Explodable, NULL, &dest);
}
if (Area->landType == INDESTRUCTIBLE_BRICK) {
SDL_QueryTexture(Game_Texture->Solidblock, NULL, NULL, &dest.w, &dest.h);
SDL_RenderCopy(Renderer, Game_Texture->Solidblock, NULL, &dest);
}
}
}
free(d);
MAP_SIZE = sizeof(地图)
我使用Visual Studio,当我在没有断点的情况下运行调试时,总是在第一次循环中遇到内存访问冲突。
具有断点和缓慢/恒定的F5推入,没有错误,循环也完成了...
我不明白为什么会出现此错误,在此示例中,两个循环没有100转,违反是完全随机的,有时在第5轮,有时在第90轮...
此代码示例在另一个外部循环中运行,并且在第一个执行正常时,其他执行永远不会出现任何违规错误。
现在,我也使用我的d
变量, if malloc() return NULL
,则退出。 GetAreaPos()
返回正确的值,但在测试中第二个FOR循环的第2轮到第6轮之间随机发生的第一个if条件下,总是会发生内存冲突
标头定义:
#define MAP_SIZE sizeof(map)
#define AREA_SIZE sizeof(union area)
#define AREA_RESOLUTION 64
#define MAP_WIDTH 10//28
#define MAP_HEIGHT 10//14
//#pragma pack(1)
typedef enum {
EMPTY = 00,
INDESTRUCTIBLE_BRICK = 10,
DESTRUCTIBLE_BRICK = 11
} landType;
typedef enum {
BONUS_BOMB_SCOPE = 000,
MALUS_BOMB_SCOPE = 001,
BONUS_BOMB_AMOUNT = 010,
MALUS_BOMB_AMOUNT = 011,
BONUS_PLAYER_SPEED = 100,
MALUS_PLAYER_SPEED = 101,
NO_BONUS_MALUS = 110,
NO_MALUS_BONUS = 111,
} bonusType;
union area {
struct {
bool inFire :4;
landType landType :8;
bool presenceBomb :4;
bool presenceBonus :4;
bonusType typeBonus :12;
};
char c;
};
//#pragma pack(0)
typedef union area map[MAP_WIDTH * MAP_HEIGHT];
您首先声明一个指针map *d;
并为其分配内存d = malloc(MAP_SIZE);
但是您忽略了返回值...
if (d == NULL)
意味着malloc
不起作用,并且这(Area->landType == DESTRUCTIBLE_BRICK)
将导致UB [因为Area = Map[k];
],但是您的代码无法避免这种情况,并且可能导致崩溃
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.