gpt4 book ai didi

c - 随机内存访问违规

转载 作者:行者123 更新时间:2023-11-30 16:57:52 27 4
gpt4 key购买 nike

我有这个示例代码:

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(map)

我使用 Visual Studio,当我在没有断点的情况下运行调试时,我总是在第一个循环中遇到内存访问冲突。

有断点和缓慢/持续的 F5 插入,没有错误,循环也完成了......

我不明白为什么会出现这个错误,在这个例子中2个循环没有100回合,违规是完全随机的,有时在第5回合,有时在第90回合......

此代码示例在另一个外部循环中运行,当第一次执行正常时,其他代码从未出现任何违规错误。

更新 1

现在,我也使用我的 d 变量并退出如果 malloc() 返回 NULLGetAreaPos() 返回正确的值,但内存违规始终出现在测试中第二个 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];] 但您的代码无法防止这种情况的发生,并且可能会崩溃

关于c - 随机内存访问违规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39252307/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com