我正在学习 SDL2 用 c 语言制作一个简单的游戏。我编写了一些代码将实体存储在一个数组中,以便我可以循环它们以渲染和移动它们。每当我按 R 时,它就会发射子弹。如果我第二次按 R 键,窗口就会关闭,它会执行一次。这是代码:
typedef struct {
int x;
int y;
int w;
int h;
int up;
int down;
int left;
int right;
SDL_Texture *texture;
} Entity;
typedef struct {
Entity *entities;
int size;
int cap;
} EntityArray;
EntityArray 实体Arr;
void addEntity(Entity *entity)
{
printf("Inside moveEntity function\n");
printf("The tmp pointer is %d bytes\n", (entityArr.size+1)*sizeof(entityArr.entities));
Entity *tmp = (Entity*)realloc(entityArr.entities,(entityArr.size+1)*sizeof(entityArr.entities)); // crashes here whenever I allocate more than 16 bytes
if(!tmp)
{
printf("Could not allocate memory for entity in array");
free(tmp);
return;
}
entityArr.entities = realloc(entityArr.entities, (entityArr.size+1)*sizeof(entityArr.entities));
entityArr.size++;
//memcpy((entityArr.entities+(entityArr.size-1)), entity, sizeof(Entity));
(*(entityArr.entities+(entityArr.size-1))) = (*entity);
printf("The entity %d has been added to the array!\n", entityArr.size);
}
int main(int argc, char **argv)
{
memset(&app, 0, sizeof(App));
memset(&player, 0, sizeof(Entity));
//memset(&entityArr, 0, sizeof(EntityArray));
entityArr.entities = calloc(1, sizeof(Entity*));
entityArr.size = 0;
entityArr.cap = 0;
initSDL();
player.x = 100;
player.y = 100;
player.w = 64;
player.h = 64;
player.texture = loadTexture("assets/textures/player.png");
printf("Player entity initialized at address: %p\n", &player);
bullet.x = player.x;
bullet.y = player.y;
bullet.w = 16;
bullet.h = 16;
bullet.up = 1;
bullet.texture = loadTexture("assets/textures/bullet.png");
if(bullet.texture)
{
printf("The bullet texture has been defined\n");
} else {
printf("The bullet texture has not been defined\n");
}
addEntity(&player);
atexit(cleanUp);
while (1)
{
prepareScene();
doInput();
moveEntity(&entityArr.entities);
blitEntity(entityArr.entities);
presentScene();
SDL_Delay(16);
}
return 0;
}
每当我尝试重新分配超过 16 个字节时,它就会崩溃
我尝试使用记忆功能,但此时我已经筋疲力尽,不知道自己在做什么
一旦您在 tmp 中获得了新的内存块,您只需将其分配给实体字段即可。第一次成功后无需进行第二次重新分配。
void addEntity(Entity *entity)
{
printf("Inside moveEntity function\n");
printf("The tmp pointer is %d bytes\n", (entityArr.size+1)*sizeof(entityArr.entities));
Entity *tmp = (Entity*)realloc(entityArr.entities,(entityArr.size+1)*sizeof(entityArr.entities)); // crashes here whenever I allocate more than 16 bytes
if(!tmp)
{
printf("Could not allocate memory for entity in array");
free(tmp);
return;
}
entityArr.entities = tmp;
entityArr.size++;
//memcpy((entityArr.entities+(entityArr.size-1)), entity, sizeof(Entity));
(*(entityArr.entities+(entityArr.size-1))) = (*entity);
printf("The entity %d has been added to the array!\n", entityArr.size);
}